Поиск по сайту:

Что такое манифест образа Docker?


Манифесты Docker описывают слои внутри образа. Манифест позволяет точно сравнить два изображения, даже если им назначены разные теги.

Манифесты выражаются в формате JSON и содержат информацию об уровнях и архитектуре образа. Клиент Docker использует манифесты, чтобы определить, совместим ли образ с текущим устройством. Затем он использует эту информацию, чтобы определить, как запускать новые контейнеры.

Формат манифеста

В настоящее время схема манифеста имеет версию 2. В полном файле будет объявлена версия схемы, а затем список записей манифеста, доступных для образа. Каждая запись представляет отдельный вариант образа, например x86 и ARM64.

Вы можете просмотреть манифест любого изображения с помощью команды docker manifest inspect. Это работает как с локальными образами, так и с образами, хранящимися в удаленном реестре, таком как Docker Hub.

docker manifest inspect my-image:latest

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

Если вы добавите флаг --verbose, вы получите еще больше информации об изображении. Сюда входит тег изображения (в поле Ref), его архитектура и операционная система.

По умолчанию Docker не загружает данные манифеста из небезопасных реестров. Если вам нужно использовать неправильно защищенный реестр, добавьте флаг --insecure в свои команды docker manifest.

Манифесты и мультиархивные сборки

Исторически Docker не поддерживал несколько архитектур образов. Образы можно было использовать только на машинах с той же архитектурой, на которой они были построены. Это быстро оказалось ограничивающим фактором, поскольку Docker нашел более широкое применение в серверных средах и на новых машинах на базе ARM.

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

docker manifest inspect php:latest

Выполнение приведенной выше команды отобразит манифест для официального образа PHP Docker. На скриншоте видно, что доступно несколько вариантов платформы, включая AMD64 и ARM. Мы сократили полный список, который на самом деле включает восемь различных поддерживаемых архитектур.

Манифесты позволяют авторам изображений рекламировать поддержку нескольких архитектур под одним тегом изображения. Клиент Docker выбирает подходящую версию образа для своей платформы на основе параметров в списке. Ожидается, что авторы будут группировать только образы, предлагающие идентичный функционал — не должно быть никаких изменений, кроме целевой архитектуры или операционной системы.

Каждая архитектура в списке ссылается на другой манифест через свое поле digest. Упомянутый манифест будет обычным файлом с одной архитектурой. Docker сопоставляет текущую платформу с правильным манифестом с одной архитектурой, а затем загружает этот файл, чтобы определить окончательный список слоев образа.

Вы можете вручную создавать мультиархитектурные образы с помощью команды docker manifest. Создайте каждый из отдельных образов и загрузите их в реестр. Затем используйте команду docker manifest create, чтобы объединить изображения в новый общий манифест под одним тегом.

# on an AMD64 machine
docker build -t my-image:amd64 .
docker push my-image:amd64

# on an ARM machine
docker build -t my-image:arm .
docker push my-image:arm

# now combine the manifests
docker manifest create my-image:latest 
--amend my-image:x64
--amend my-image:arm
docker manifest push my-image:latest

Использование manifest create с флагом --amend позволяет объединить несколько независимых манифестов. Затем окончательный манифест отправляется в Docker Hub с тегом latest. Пользователи AMD64 и ARM смогут создавать контейнеры из этого образа.

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

docker buildx build --platform linux/amd64,linux/arm64/v8 --tag my-image:latest

Результатом этой единственной команды является образ, который работает как на платформах AMD64, так и на платформах ARM64. Под капотом он по-прежнему создает список манифестов с несколькими архитектурами, поэтому полезно понять внутреннюю работу того, как изображения связаны друг с другом.

Аннотирование манифестов

Docker позволяет вручную переопределять данные манифеста с помощью аннотаций. Поддерживаемые поля включают информацию об архитектуре и операционной системе.

Используйте команду docker manifest annotate для настройки аннотаций. Если вы аннотируете образ с одной архитектурой, укажите тег изображения, который ссылается на него. Для образов с несколькими архитектурами вам понадобится как общий тег изображения, так и тег отдельного манифеста в списке манифестов с несколькими архитектурами.

docker manifest annotate my-image:latest my-image:amd64 --os-version linux

Эта команда помечает версию AMD64 образа my-image:latest как контейнер на базе Linux.

Аннотации не часто нужно задавать вручную. Обычно они выводятся автоматически из среды сборки. Вы можете использовать команду annotate, чтобы добавить отсутствующие поля или изменить конфигурацию изображения в будущем.

Краткое содержание

Манифесты Docker описывают слои образа и поддерживаемые им архитектуры. Манифест может быть как с одной архитектурой, поддерживающей определенную платформу, так и с несколькими архитектурами. В последнем случае файл содержит список ссылок на манифесты одной архитектуры, которые он включает.

Ручное взаимодействие с манифестами должно быть редким, но возможно с помощью группы команд docker manifest. Сейчас более распространена автоматизация сборки с несколькими архитектурами через Buildx, который предлагает упрощенный процесс сборки манифеста.