構建多架構擴充套件

強烈建議您的擴充套件至少支援以下架構:

  • linux/amd64
  • linux/arm64

Docker Desktop 會根據使用者的系統架構檢索擴充套件映象。如果擴充套件未提供與使用者系統架構匹配的映象,Docker Desktop 將無法安裝該擴充套件。因此,使用者無法在 Docker Desktop 中執行該擴充套件。

為多種架構構建和推送

如果您是使用 `docker extension init` 命令建立的擴充套件,則目錄根目錄下的 `Makefile` 包含一個名為 `push-extension` 的目標。

您可以執行 `make push-extension` 來針對 `linux/amd64` 和 `linux/arm64` 平臺構建您的擴充套件,並將其推送到 Docker Hub。

例如:

$ make push-extension

或者,如果您是從空目錄開始的,請使用以下命令為多種架構構建您的擴充套件:

$ docker buildx build --push --platform=linux/amd64,linux/arm64 --tag=username/my-extension:0.0.1 .

然後,您可以使用 `docker buildx imagetools` 命令檢查映象清單,檢視映象是否適用於兩種架構。

$ docker buildx imagetools inspect username/my-extension:0.0.1
Name:      docker.io/username/my-extension:0.0.1
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest:    sha256:f3b552e65508d9203b46db507bb121f1b644e53a22f851185d8e53d873417c48

Manifests:
  Name:      docker.io/username/my-extension:0.0.1@sha256:71d7ecf3cd12d9a99e73ef448bf63ae12751fe3a436a007cb0969f0dc4184c8c
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/amd64

  Name:      docker.io/username/my-extension:0.0.1@sha256:5ba4ceea65579fdd1181dfa103cc437d8e19d87239683cf5040e633211387ccf
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/arm64
提示

如果您在推送映象時遇到問題,請確保您已登入 Docker Hub。否則,請執行 `docker login` 進行身份驗證。

有關更多資訊,請參閱多平臺映象頁面。

新增多架構二進位制檔案

如果您的擴充套件包含部署到主機的二進位制檔案,那麼在為多種架構構建擴充套件時,這些二進位制檔案也必須具有正確的架構,這一點很重要。

目前,Docker 不提供在 `metadata.json` 檔案中為每個架構明確指定多個二進位制檔案的方法。但是,您可以根據擴充套件的 `Dockerfile` 中的 `TARGETARCH` 新增特定於架構的二進位制檔案。

以下示例展示了一個使用二進位制檔案作為其操作一部分的擴充套件。該擴充套件需要在 Mac 和 Windows 上的 Docker Desktop 中執行。

在 `Dockerfile` 中,根據目標架構下載二進位制檔案。

#syntax=docker/dockerfile:1.3-labs

FROM alpine AS dl
WORKDIR /tmp
RUN apk add --no-cache curl tar
ARG TARGETARCH
RUN <<EOT ash
    mkdir -p /out/darwin
    curl -fSsLo /out/darwin/kubectl "https://dl.k8s.io/release/$(curl -Ls https://dl.k8s.io/release/stable.txt)/bin/darwin/${TARGETARCH}/kubectl"
    chmod a+x /out/darwin/kubectl
EOT
RUN <<EOT ash
    if [ "amd64" = "$TARGETARCH" ]; then
        mkdir -p /out/windows
        curl -fSsLo /out/windows/kubectl.exe "https://dl.k8s.io/release/$(curl -Ls https://dl.k8s.io/release/stable.txt)/bin/windows/amd64/kubectl.exe"
    fi
EOT

FROM alpine
LABEL org.opencontainers.image.title="example-extension" \
    org.opencontainers.image.description="My Example Extension" \
    org.opencontainers.image.vendor="Docker Inc." \
    com.docker.desktop.extension.api.version=">= 0.3.3"

COPY --from=dl /out /

在 `metadata.json` 檔案中,為每個平臺指定每個二進位制檔案的路徑。

{
  "icon": "docker.svg",
  "ui": {
    "dashboard-tab": {
      "title": "Example Extension",
      "src": "index.html",
      "root": "ui"
    }
  },
  "host": {
    "binaries": [
      {
        "darwin": [
          {
            "path": "/darwin/kubectl"
          }
        ],
        "windows": [
          {
            "path": "/windows/kubectl.exe"
          }
        ]
      }
    ]
  }
}

因此,當 `TARGETARCH` 等於

  • “arm64”時,獲取的 `kubectl` 二進位制檔案對應於 `arm64` 架構,並複製到最終階段的 `/darwin/kubectl`。
  • “amd64”時,會獲取兩個 `kubectl` 二進位制檔案。一個用於 Darwin,另一個用於 Windows。它們分別複製到最終階段的 `/darwin/kubectl` 和 `/windows/kubectl.exe`。
注意

兩種情況下,Darwin 的二進位制目標路徑都是 `darwin/kubectl`。唯一的區別是下載的特定於架構的二進位制檔案。

安裝擴充套件後,擴充套件框架會將 Darwin 的擴充套件映象中的二進位制檔案從 `/darwin/kubectl` 複製到使用者主機檔案系統中的特定位置,或將 Windows 的二進位制檔案從 `/windows/kubectl.exe` 複製到使用者主機檔案系統中的特定位置。

我可以開發執行 Windows 容器的擴充套件嗎?

儘管 Docker Extensions 支援 Windows、Mac 和 Linux 上的 Docker Desktop,但擴充套件框架僅支援 Linux 容器。因此,在構建擴充套件映象時,您必須將 `linux` 作為作業系統目標。