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
FROMw 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 scratchw 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.