Przewidywany czas czytania: 3 minuty
Większość plików Dockerfiles rozpoczyna się od obrazu macierzystego. Jeśli chcesz całkowicie kontrolować zawartość swojego obrazu, możesz zamiast tego utworzyć obraz bazowy.Oto różnica:
-
Obraz macierzysty jest obrazem, na którym opiera się twój obraz. Odnosi się on do zawartości dyrektywy
FROM
w plikuDockerfile. Każda kolejna deklaracja w pliku Dockerfile modyfikuje ten obraz macierzysty. Większość plików Dockerfile zaczyna się od obrazu macierzystego, a nie od obrazu bazowego, jednak terminy te są czasem używane zamiennie. -
Obraz bazowy ma
FROM scratch
w swoim pliku Dockerfile.
Ten temat pokazuje kilka sposobów tworzenia obrazu bazowego. Konkretny proces będzie w dużej mierze zależał od dystrybucji Linuksa, którą chcemy pakować. Poniżej przedstawiamy kilka przykładów i zachęcamy do składania wniosków o dodanie nowych.
Tworzenie pełnego obrazu przy użyciu tar
Generalnie, należy zacząć od działającej maszyny, która działa z dystrybucją, którą chcemy zapakować jako obraz macierzysty, choć nie jest to wymagane w przypadku niektórych narzędzi, takich jak Debian’sDebootstrap, które można również wykorzystać do budowania obrazów Ubuntu.
Tworzenie obrazu macierzystego Ubuntu może być tak proste jak poniżej:
$ sudo debootstrap xenial xenial > /dev/null$ sudo tar -C xenial -c . | docker import - xeniala29c15f1bf7a$ docker run xenial cat /etc/lsb-releaseDISTRIB_ID=UbuntuDISTRIB_RELEASE=16.04DISTRIB_CODENAME=xenialDISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"
W repozytorium DockerGitHub znajduje się więcej przykładowych skryptów do tworzenia obrazów macierzystych.
Tworzenie prostego obrazu macierzystego przy użyciu scratch
Możesz użyć zarezerwowanego, minimalnego obrazu Dockera, scratch
, jako punktu wyjścia do budowania kontenerów. Użycie scratch
„image” sygnalizuje procesowi budowania, że chcesz, aby następne polecenie w Dockerfile
było pierwszą warstwą systemu plików w twoim obrazie.
Pomimo że scratch
pojawia się w repozytorium Dockera na hubie, nie możesz go wyciągnąć, uruchomić ani oznaczyć żadnego obrazu nazwą scratch
. Zamiast tego możesz się do niego odwoływać w swoim Dockerfile
. Na przykład, aby utworzyć minimalny kontener przy użyciuscratch
:
FROM scratchADD hello /CMD
Zakładając, że zbudowałeś przykład wykonywalny „hello”, postępując zgodnie z instrukcjami na stroniehttps://github.com/docker-library/hello-world/, i skompilowałeś go z flagą -static
, możesz zbudować ten obraz Dockerimage używając tego docker build
polecenia:
docker build --tag hello .
Nie zapomnij o znaku .
na końcu, który ustawia kontekst budowania na bieżący katalog.
Uwaga: Ponieważ Docker Desktop for Mac i Docker Desktop for Windows używają maszyny wirtualnej Linux, potrzebujesz binarki Linuxa, a nie binarki Maca lub Windowsa.Możesz użyć kontenera Docker, aby go zbudować:
$ docker run --rm -it -v $PWD:/build ubuntu:16.04container# apt-get update && apt-get install build-essentialcontainer# cd /buildcontainer# gcc -o hello -static -nostartfiles hello.c
Aby uruchomić nowy obraz, użyj polecenia docker run
:
docker run --rm hello
Ten przykład tworzy obraz hello-world używany w tutorialach.Jeśli chcesz go przetestować, możesz sklonować repo tego obrazu.
Więcej zasobów
Jest wiele dostępnych zasobów, które pomogą ci napisać twój Dockerfile
.