构建多架构扩展
强烈建议至少您的扩展程序支持以下架构:
linux/amd64linux/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进行身份验证。
有关更多信息,请参阅 多平台镜像页面。
添加多架构Binaries
如果您的扩展包含部署到宿主机的Binaries,则在针对多种架构构建扩展时,确保这些Binaries也具有正确的架构非常重要。
目前,Docker 尚未提供在 metadata.json 文件中为每种架构显式指定多个Binaries的方法。不过,您可以根据扩展的 Dockerfile 中的 TARGETARCH,添加特定于架构的Binaries。
以下示例展示了一个扩展程序,该扩展在其操作中使用Binaries。该扩展程序需要同时在 Docker Desktop 的 macOS 和 Windows 版本上运行。
在 Dockerfile 中,根据目标架构下载Binaries:
#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 文件中,为每个平台上的每个Binaries指定路径:
{
"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,获取的kubectlBinaries对应于arm64架构,并在最终阶段被复制到/darwin/kubectl。amd64,将获取两个kubectlBinaries:一个适用于 Darwin(macOS),另一个适用于 Windows。在最终阶段,它们将分别被复制到/darwin/kubectl和/windows/kubectl.exe。
注意
在两种情况下,Darwin 的Binaries目标路径均为
darwin/kubectl。唯一的变化是下载的特定于架构的Binaries。
当扩展安装完成后,扩展框架会将扩展镜像中的Binaries从 /darwin/kubectl(针对 Darwin 系统)或 /windows/kubectl.exe(针对 Windows 系统)复制到用户主机文件系统的指定位置。
我可以开发运行 Windows 容器的扩展吗?
尽管 Docker Extensions 支持在 Windows、macOS 和 Linux 版 Docker Desktop 上运行,但扩展框架仅支持 Linux 容器。因此,在构建扩展镜像时,您必须将操作系统(OS)目标设置为 linux。