為多個架構構建擴充套件
強烈建議至少為以下架構提供擴充套件支援
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
新增特定於架構的二進位制檔案。
以下示例顯示了一個使用二進位制檔案作為其操作一部分的擴充套件。該擴充套件需要在 Docker Desktop for Mac 和 Windows 中執行。
在 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/kubectl
(對於 Darwin)或 /windows/kubectl.exe
(對於 Windows)中的二進位制檔案複製到使用者主機檔案系統中的特定位置。
我能否開發執行 Windows 容器的擴充套件?
儘管 Docker Extensions 支援 Docker Desktop for Windows、Mac 和 Linux,但擴充套件框架僅支援 Linux 容器。因此,在構建擴充套件映像時,必須將 linux
作為作業系統進行目標設定。