Share via


Azure 容器登錄中的多結構映像

本文介紹多結構映像,以及如何透過 Azure Container Registry 功能來協助您建立、儲存與使用。

多結構映像是一種容器映像類型,可合併不同結構的變體,有時也可供不同的作業系統使用。 執行支援多結構的映像時,容器用戶端會自動選取符合您 OS 和結構的映像變體。

資訊清單

多結構映像是以映像資訊清單為基礎。

Manifest

每個容器映像都是以資訊清單表示。 資訊清單是可唯一識別映像的 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 CLI 中的 az acr manifest list-metadata 命令等工具,在 Azure Container Registry 中檢視資訊清單。

資訊清單

多結構映像的資訊清單 (通常稱為 OCI 映像的映像索引) 即為映像 (索引) 集合,您可以藉由指定一個或多個映像名稱加以建立。 其中包含每個映像的詳細資訊,例如支援的 OS 和結構、大小以及資訊清單摘要。 在 docker pulldocker run 命令中,您可以採取與映像名稱相同的方法來使用資訊清單。

docker CLI 會使用 docker 資訊清單命令來管理資訊清單。

注意

目前,docker manifest 命令和子命令均為實驗性質。 如需使用實驗性命令的詳細資訊,請參閱 Docker 文件。

您可以使用 docker manifest inspect 命令來檢視資訊清單。 以下是多結構映像 mcr.microsoft.com/mcr/hello-world:latest 的輸出,包含三個資訊清單:兩個適用於 Linux OS 結構,另一個適用於 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 Container Registry 後,您也可以使用 Azure 入口網站或 az acr manifest list-metadata 命令等工具來檢視資訊清單。

匯入多結構映像

可以使用 az acr import 命令將現有的多結構映像匯入至 Azure 容器登錄。 映像匯入語法與單一結構映像相同。 與匯入單一結構映像相同,匯入多結構映像時不會使用 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 多結構映像的多步驟工作

下列範例假設您的兩個結構 (arm64 和 amd64) 分別擁有各自的 Dockerfile。 系統建置並推送結構特定的映像後,會建立並推送含 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 外掛程式來建置多平台映像。