Введение
В этой лабораторной работе (lab) вы научитесь эффективно использовать команду docker buildx imagetools create для объединения и тегирования Docker-образов. Этот практический опыт проведет вас через процесс создания нового образа путем слияния содержимого из нескольких исходных образов — распространенная практика при сборке сложных приложений.
Затем вы изучите, как тегировать вновь созданный образ, предварительно просматривать структуру финального образа без отправки с помощью флага --dry-run, а также добавлять полезные аннотации к индексу образа для лучшей организации и управления метаданными. К концу этой лабораторной работы вы получите четкое понимание того, как использовать docker buildx imagetools create для продвинутой работы с образами и управления ими.
Создание нового образа из нескольких исходных образов
На этом шаге мы научимся создавать новый Docker-образ, объединяя содержимое нескольких исходных образов. Это распространённый сценарий, когда вам нужно собрать образ, включающий компоненты из разных базовых образов или предварительно собранных образов.
Сначала загрузим необходимые исходные образы. В качестве примеров будем использовать образы ubuntu и alpine.
docker pull ubuntu:latest
docker pull alpine:latest
Вы должны увидеть вывод, указывающий на загрузку образов.
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
Теперь создадим новый образ с помощью Dockerfile. Dockerfile — это текстовый документ, содержащий все команды, которые пользователь может выполнить в командной строке для сборки образа. Создайте новый файл с именем Dockerfile в вашей директории ~/project.
nano ~/project/Dockerfile
Добавьте следующее содержимое в Dockerfile:
FROM ubuntu:latest AS base
FROM alpine:latest AS alpine_base
COPY --from=alpine_base /etc/alpine-release /app/alpine-release
COPY --from=base /etc/os-release /app/ubuntu-release
WORKDIR /app
CMD ["ls", "-l"]
Разберём этот Dockerfile:
FROM ubuntu:latest AS base: Эта строка устанавливает базовый образ для первого этапа сборки какubuntu:latestи называет этот этапbase.FROM alpine:latest AS alpine_base: Эта строка начинает новый этап сборки, используяalpine:latestв качестве базового образа, и называет этот этапalpine_base. Это многоэтапная сборка, позволяющая копировать файлы между этапами.COPY --from=alpine_base /etc/alpine-release /app/alpine-release: Эта команда копирует файл/etc/alpine-releaseиз этапаalpine_baseв директорию/app/alpine-releaseтекущего этапа.COPY --from=base /etc/os-release /app/ubuntu-release: Эта команда копирует файл/etc/os-releaseиз этапаbaseв директорию/app/ubuntu-releaseтекущего этапа.WORKDIR /app: Устанавливает рабочую директорию для последующих инструкций как/app.CMD ["ls", "-l"]: Задаёт команду по умолчанию, которая выполняется при запуске контейнера из этого образа. Она выводит содержимое директории/app.
Сохраните Dockerfile, нажав Ctrl + X, затем Y и Enter.
Теперь соберём образ с помощью команды docker build. Символ . в конце команды указывает контекст сборки — текущую директорию (~/project).
docker build -t my-multi-stage-image:latest ~/project
Вы должны увидеть вывод, показывающий процесс сборки, включая выполнение различных этапов.
[+] Building
...
Successfully built <image_id>
Successfully tagged my-multi-stage-image:latest
После завершения сборки вы можете проверить создание образа, выведя список локальных образов.
docker images my-multi-stage-image
В списке должен появиться ваш новый образ.
REPOSITORY TAG IMAGE ID CREATED SIZE
my-multi-stage-image latest <image_id> About a minute ago ...MB
Наконец, запустим контейнер из этого образа, чтобы увидеть скопированные файлы.
docker run --rm my-multi-stage-image:latest
Флаг --rm автоматически удаляет контейнер после его завершения. В выводе должны отобразиться файлы, скопированные из образов ubuntu и alpine.
total 8
-rw-r--r-- 1 root root 25 Aug 24 10:00 alpine-release
-rw-r--r-- 1 root root 281 Aug 24 10:00 ubuntu-release
Это подтверждает, что мы успешно создали образ, объединив содержимое нескольких исходных образов с помощью многоэтапной сборки.
Добавление тега к новому образу
На этом шаге мы научимся добавлять дополнительные теги к Docker-образу, созданному на предыдущем этапе. Тегирование образа полезно для управления версиями, идентификации различных сборок или связывания образа с определённым репозиторием.
На предыдущем шаге мы собрали образ и автоматически присвоили ему тег my-multi-stage-image:latest. Теперь добавим к этому образу ещё один тег, например, my-multi-stage-image:v1.0.
Команда docker tag используется для создания тега TARGET_IMAGE, который ссылается на SOURCE_IMAGE. Синтаксис: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG].
Сначала выведем список существующих образов, чтобы подтвердить ID образа my-multi-stage-image:latest.
docker images my-multi-stage-image
Вы увидите вывод, похожий на этот, где <image_id> — уникальный идентификатор вашего образа:
REPOSITORY TAG IMAGE ID CREATED SIZE
my-multi-stage-image latest <image_id> ... ...MB
Теперь используем команду docker tag для добавления тега v1.0 к этому образу. В качестве источника можно использовать либо имя и тег образа (my-multi-stage-image:latest), либо его ID (<image_id>). Использование имени и тега обычно удобнее.
docker tag my-multi-stage-image:latest my-multi-stage-image:v1.0
Эта команда создаёт новый тег v1.0, указывающий на тот же ID образа, что и my-multi-stage-image:latest. При успешном выполнении команды вывод отсутствует.
Чтобы проверить добавление нового тега, снова выведем список образов.
docker images my-multi-stage-image
Теперь вы должны увидеть оба тега, связанные с одним ID образа:
REPOSITORY TAG IMAGE ID CREATED SIZE
my-multi-stage-image latest <image_id> ... ...MB
my-multi-stage-image v1.0 <image_id> ... ...MB
Вы успешно добавили новый тег к вашему Docker-образу. Это позволяет обращаться к одному и тому же образу, используя разные имена или версии.
Просмотр финального образа без отправки с использованием --dry-run
На этом шаге мы рассмотрим, как просмотреть детали финального образа, который будет отправлен в реестр, без фактического выполнения операции push. Это полезно для проверки манифеста и конфигурации образа перед его публикацией.
Команда docker manifest позволяет просматривать и управлять манифестами образов. Манифест образа — это JSON-документ, описывающий образ, включая его слои, конфигурацию и потенциальные ссылки на другие платформо-специфичные образы в списке манифестов.
Чтобы показать манифест нашего образа my-multi-stage-image:latest без отправки, мы можем использовать команду docker manifest inspect с флагом --dry-run.
docker manifest inspect --dry-run my-multi-stage-image:latest
Эта команда выведет манифест образа в формате JSON в ваш терминал. Флаг --dry-run предотвращает попытки команды связаться с реестром или отправить какие-либо данные.
Вывод будет представлять собой детализированную JSON-структуру, описывающую образ. Она будет включать информацию о конфигурации образа, его слоях (представленных их дайджестами) и других метаданных.
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": ...,
"digest": "sha256:..."
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": ...,
"digest": "sha256:..."
},
...
]
}
Вы можете изучить этот вывод, чтобы понять структуру и содержимое вашего образа в том виде, в котором он будет представлен в реестре. Это особенно полезно для отладки или проверки состава образа.
Обратите внимание, что точное содержимое JSON-вывода будет варьироваться в зависимости от слоёв и конфигурации образа.
Добавление аннотаций к созданному индексу образов
На этом шаге мы научимся добавлять аннотации к индексу образов (также известному как список манифестов). Индекс образов используется для ссылки на несколько манифестов образов, обычно для разных архитектур или операционных систем. Добавление аннотаций к индексу предоставляет метаданные о всём наборе образов.
Хотя наш текущий образ my-multi-stage-image является одноархитектурным, мы всё равно можем продемонстрировать концепцию добавления аннотаций к его манифесту, который в данном случае выступает в качестве простого индекса.
Команда docker manifest annotate используется для добавления или обновления аннотаций для конкретного образа в списке манифестов. Синтаксис: docker manifest annotate MANIFEST_LIST IMAGE --annotation KEY=VALUE.
Сначала создадим список манифестов для нашего образа. Поскольку у нас только один образ, список манифестов будет просто ссылаться на наш существующий образ. Используем команду docker manifest create.
docker manifest create my-multi-stage-image:annotated my-multi-stage-image:latest
Эта команда создаёт новый список манифестов с именем my-multi-stage-image:annotated, включающий ссылку на my-multi-stage-image:latest. При успешном выполнении вывод отсутствует.
Теперь мы можем использовать команду docker manifest annotate для добавления аннотации к записи my-multi-stage-image:latest в списке манифестов my-multi-stage-image:annotated. Добавим аннотацию, указывающую операционную систему.
docker manifest annotate my-multi-stage-image:annotated my-multi-stage-image:latest --annotation "os=linux"
Эта команда добавляет аннотацию os=linux к записи манифеста для my-multi-stage-image:latest в списке my-multi-stage-image:annotated. Снова нет вывода при успешном выполнении.
Чтобы проверить добавление аннотации, мы можем просмотреть список манифестов с помощью docker manifest inspect.
docker manifest inspect my-multi-stage-image:annotated
Вывод будет представлять собой JSON-структуру, описывающую список манифестов. Вы должны увидеть добавленную аннотацию в записи для my-multi-stage-image:latest. Ищите поле "annotations" в массиве "manifests".
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": ...,
"digest": "sha256:...",
"platform": {
"architecture": "amd64",
"os": "linux"
},
"annotations": {
"os": "linux"
}
}
]
}
Вы успешно добавили аннотацию к индексу образов. Аннотации предоставляют ценные метаданные, которые могут использоваться реестрами и клиентами для лучшего понимания образов, с которыми они работают.
Резюме
В этой лабораторной работе мы изучили, как использовать команду docker buildx imagetools create для объединения и тегирования образов. Мы начали с создания нового образа из нескольких исходных образов с использованием многоэтапного Dockerfile, продемонстрировав копирование файлов между разными базовыми образами.
После создания образа мы рассмотрели, как добавить тег к новому образу и использовали флаг --dry-run для предварительного просмотра финального образа без его отправки. В завершение мы научились добавлять аннотации к созданному индексу образов, предоставляя дополнительные метаданные для объединённого образа.



