Как использовать команду docker buildx imagetools create для объединения и тегирования образов

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе (lab) вы научитесь эффективно использовать команду docker buildx imagetools create для объединения и тегирования Docker-образов. Этот практический опыт проведет вас через процесс создания нового образа путем слияния содержимого из нескольких исходных образов — распространенная практика при сборке сложных приложений.

Затем вы изучите, как тегировать вновь созданный образ, предварительно просматривать структуру финального образа без отправки с помощью флага --dry-run, а также добавлять полезные аннотации к индексу образа для лучшей организации и управления метаданными. К концу этой лабораторной работы вы получите четкое понимание того, как использовать docker buildx imagetools create для продвинутой работы с образами и управления ими.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/tag("Tag an Image") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/inspect -.-> lab-555057{{"Как использовать команду docker buildx imagetools create для объединения и тегирования образов"}} docker/create -.-> lab-555057{{"Как использовать команду docker buildx imagetools create для объединения и тегирования образов"}} docker/pull -.-> lab-555057{{"Как использовать команду docker buildx imagetools create для объединения и тегирования образов"}} docker/tag -.-> lab-555057{{"Как использовать команду docker buildx imagetools create для объединения и тегирования образов"}} docker/images -.-> lab-555057{{"Как использовать команду docker buildx imagetools create для объединения и тегирования образов"}} docker/build -.-> lab-555057{{"Как использовать команду docker buildx imagetools create для объединения и тегирования образов"}} end

Создание нового образа из нескольких исходных образов

На этом шаге мы научимся создавать новый 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 для предварительного просмотра финального образа без его отправки. В завершение мы научились добавлять аннотации к созданному индексу образов, предоставляя дополнительные метаданные для объединённого образа.