Создание базового образа

Большинство Docker-файлов начинаются с родительского образа. Если вам нужно полностью контролировать содержимое вашего образа, вам может понадобиться создать базовый образ. Вот в чем разница:

  • образ родителя — это образ, на котором основан ваш образ. Он ссылается на содержимое директивы FROM в Dockerfile. Каждое последующее объявление в Dockerfile изменяет данный родительский образ. Большинство Dockerфайлов начинаются с родительского образа, а не с базового. Однако иногда данные термины используются как взаимозаменяемые.

  • A базовое образ имеет FROM scratch в своём Dockerfile.

В этой теме показано несколько способов создания базового образа. Конкретный процесс будет в значительной степени зависеть от дистрибутива Linux, который вы хотите упаковать. Мы приводим несколько примеров далее, и мы рекомендуем вам подавать запросы на добавление новых примеров.

Создание полного образа с помощью tar

В общем, начать с работающей машины, на которой работает дистрибутив, который вы хотите упаковать в качестве родительского образа, хотя это не требуется для некоторых инструментов, таких как Debian Debootstrap, которые вы также можете использовать для сборки образов Ubuntu.

Создание родительского образа Ubuntu может быть таким же простым:

$ sudo debootstrap focal focal > /dev/null
$ sudo tar -C focal -c . | docker import - focal

sha256:81ec9a55a92a5618161f68ae691d092bf14d700129093158297b3d01593f4ee3

$ docker run focal cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04 LTS"

Есть ещё примеры скриптов для создания родительских образов в репозиторий Docker на GitHub.

Создание простого родительского образа с помощью scratch

Вы можете использовать зарезервированный минимальный образ Docker, scratch, в качестве отправной точки для сборки контейнеров. Использование «образа» scratch сигнализирует процессу сборки, что вы хотите, чтобы следующая команда в Dockerfile была первым уровнем файловой системы в вашем образе.

Хотя scratch появляется в репозитории Docker на хабе, вы не можете извлечь его, запускает или пометить любой образ именем scratch. Вместо этого вы можете ссылаться на него в своём Dockerfile. Например, чтобы создать минимальный контейнер с помощью scratch:

# syntax=docker/dockerfile:1
FROM scratch
ADD hello /
CMD ["/hello"]

Предположим, что вы собрали исполняемый пример «hello», используя исходный код на https://github.com/docker-library/hello-world, и скомпилировали его с флагом -static, вы можете собрать данный образ Docker, используя эту команду docker build:

$ docker build --tag hello .

Не забудьте про символ . в конце, который устанавливает контекст сборки в текущий каталог.

Примечание

Поскольку Docker Desktop для Mac и Docker Desktop для Windows используют виртуальную машину Linux, вам нужен двоичный файл Linux, а не двоичный файл Mac или Windows. Для его создания можно использовать контейнер Docker:

$ docker run --rm -it -v $PWD:/build ubuntu:20.04

container# apt-get update && apt-get install build-essential
container# cd /build
container# gcc -o hello -static hello.c

Чтобы запускает новый образ, используйте команду docker run:

$ docker run --rm hello

В этом примере создаётся образ приветствия, используемое в руководствах. Если вы хотите проверяет это, вы можете клонировать репозиторий образов.

Дополнительные ресурсы

Существует множество ресурсов, которые помогут вам написать Dockerfile.