Образы с несколькими архитектурами в реестре контейнеров Azure

В этой статье представлены образы c несколькими архитектурами (многоархитектурные), а также то, как использовать функции реестра контейнеров Azure для их создания, хранения и использования.

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

Манифесты и списки манифестов

Многоархитектурные образы основаны на манифестах образов и списках манифестов.

манифеста

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

Базовый манифест образа Linux hello-world выглядит примерно следующим образом:

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
  "config": {
      "mediaType": "application/vnd.docker.container.image.v1+json",
      "size": 1510,
      "digest": "sha256:fbf289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e"
    },
  "layers": [
      {
        "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
        "size": 977,
        "digest": "sha256:2c930d010525941c1d56ec53b97bd057a67ae1865eebf042686d2a2d18271ced"
      }
    ]
}

Просмотреть манифест в реестре контейнеров Azure можно с помощью портала Azure или таких средств, как команда az acr manifest list-metadata в Azure CLI.

Список манифестов

Список манифестов для многоархитектурного образа (более известный как индекс образа в случае образов OCI) — это коллекция (индекс) образов, которую можно создать, указав одно или несколько имен образов. Она содержит подробные сведения о каждом из образов, такие как его поддерживаемая ОС, архитектура, размер и дайджест манифеста. Список манифестов можно использовать так же, как имя образа в командах docker pull и docker run.

CLI docker управляет манифестами и списками манифестов с помощью команды docker manifest.

Примечание.

В настоящее время команда docker manifest и подкоманды экспериментальны. Дополнительные сведения об использовании экспериментальных команд см. в документации по Docker.

Список манифестов можно просмотреть с помощью команды docker manifest inspect. Ниже приведены выходные данные для образа с несколькими архитектурами mcr.microsoft.com/mcr/hello-world:latest, в котором есть три манифеста: два для архитектуры ОС Linux и один для архитектуры Windows.

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
  "manifests": [
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 524,
      "digest": "sha256:83c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a",
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 525,
      "digest": "sha256:873612c5503f3f1674f315c67089dee577d8cc6afc18565e0b4183ae355fb343",
      "platform": {
        "architecture": "arm64",
        "os": "linux"
      }
    },
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 1124,
      "digest": "sha256:b791ad98d505abb8c9618868fc43c74aa94d08f1d7afe37d19647c0030905cae",
      "platform": {
        "architecture": "amd64",
        "os": "windows",
        "os.version": "10.0.17763.1697"
      }
    }
  ]
}

Если список манифестов с несколькими архитектурами хранится в реестре контейнеров Azure, то список манифестов можно также просмотреть с помощью портала Azure или с помощью таких средств, как команда az acr manifest list-metadata.

Импорт многоархитектурного образа

Существующий образ с несколькими архитектурами можно импортировать в реестр контейнеров Azure с помощью команды az acr import. Синтаксис импорта изображения такой же, как и для образа с одной архитектурой. Как и при импорте образа с одной архитектурой, импорт образа с несколькими архитектурами не использует команды Docker.

Подробные сведения см. в разделе Импорт образов контейнеров в реестр контейнеров.

Отправка многоархитектурного образа

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

  1. Пометьте и отправьте в реестр контейнеров каждый образ, относящийся к конкретной архитектуре. В следующем примере предполагается наличие двух архитектур Linux: arm64 и amd64.

    docker tag myimage:arm64 \
      myregistry.azurecr.io/multi-arch-samples/myimage:arm64
    
    docker push myregistry.azurecr.io/multi-arch-samples/myimage:arm64
    
    docker tag myimage:amd64 \
      myregistry.azurecr.io/multi-arch-samples/myimage:amd64
    
    docker push myregistry.azurecr.io/multi-arch-samples/myimage:amd64
    
  2. Выполните команду docker manifest create, чтобы создать список манифестов для объединения предыдущих образов в образ с несколькими архитектурами.

    docker manifest create myregistry.azurecr.io/multi-arch-samples/myimage:multi \
     myregistry.azurecr.io/multi-arch-samples/myimage:arm64 \
     myregistry.azurecr.io/multi-arch-samples/myimage:amd64
    
  3. Отправьте манифест в реестр контейнеров с помощью docker manifest push:

    docker manifest push myregistry.azurecr.io/multi-arch-samples/myimage:multi
    
  4. Используйте команду docker manifest inspect для просмотра списка манифестов. Пример выходных данных команды приведен в предыдущем разделе.

После передачи манифеста с несколькими архитектурами в реестр работа с образом с несколькими архитектурами будет выполняться так же, как и с одноархитектурным образом. Например, извлеките образ с помощью docker pull и используйте команды az acr repository для просмотра тегов, манифестов и других свойств образа.

Создание и отправка образа с несколькими архитектурами

Используя функции Задач ACR учетных записей, вы можете собрать и отправить образ с несколькими архитектурами в реестр контейнеров Azure. Например, определите многошаговую задачу в файле YAML, который создает образ с несколькими архитектурами Linux.

В следующем примере предполагается, что у вас есть отдельные файлы dockerfile для двух архитектур, arm64 и amd64. Он создает и отправляет образы, относящиеся к конкретной архитектуре, а затем создает и отправляет манифест с несколькими структурами, содержащий тег latest:

version: v1.1.0

steps:
- build: -t {{.Run.Registry}}/multi-arch-samples/myimage:{{.Run.ID}}-amd64 -f dockerfile.arm64 . 
- build: -t {{.Run.Registry}}/multi-arch-samples/myyimage:{{.Run.ID}}-arm64 -f dockerfile.amd64 . 
- push: 
    - {{.Run.Registry}}/multi-arch-samples/myimage:{{.Run.ID}}-arm64
    - {{.Run.Registry}}/multi-arch-samples/myimage:{{.Run.ID}}-amd64
- cmd: >
    docker manifest create
    {{.Run.Registry}}/multi-arch-samples/myimage:latest
    {{.Run.Registry}}/multi-arch-samples/myimage:{{.Run.ID}}-arm64
    {{.Run.Registry}}/multi-arch-samples/myimage:{{.Run.ID}}-amd64
- cmd: docker manifest push --purge {{.Run.Registry}}/multi-arch-samples/myimage:latest
- cmd: docker manifest inspect {{.Run.Registry}}/multi-arch-samples/myimage:latest

Следующие шаги

  • Используйте Azure Pipelines, чтобы создавать образы контейнеров для различных архитектур.
  • Дополнительные сведения о создании образов с несколькими платформами с помощью экспериментального подключаемого модуля Docker buildx.