构建多种架构的扩展
强烈建议您的扩展至少支持以下架构:
linux/amd64
linux/arm64
Docker Desktop根据用户的系统架构检索扩展镜像。如果扩展未提供与用户系统架构匹配的镜像,Docker Desktop 将无法安装该扩展。因此,用户无法在 Docker Desktop 中运行该扩展。
构建并推动多种架构
如果您通过命令创建了扩展docker extension init
,则
Makefile
目录根目录中的 包含名称为 的目标
push-extension
。
您可以针对这两个平台运行构建make push-extension
扩展
,并将它们推送到 Docker Hub。linux/amd64
linux/arm64
例如:
$ 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
。但是,您可以根据TARGETARCH
扩展的Dockerfile
.
以下示例显示了使用二进制文件作为其操作一部分的扩展。该扩展需要在 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/kubectl
在这两种情况下都是如此。唯一的变化是下载的特定于体系结构的二进制文件。
安装扩展后,扩展框架会将二进制文件从/darwin/kubectl
Darwin 或/windows/kubectl.exe
Windows 的扩展映像复制到用户主机文件系统中的特定位置。
我可以开发运行 Windows 容器的扩展吗?
尽管适用于 Windows、Mac 和 Linux 的 Docker Desktop 支持 Docker 扩展,但扩展框架仅支持 Linux 容器。因此,linux
在构建扩展映像时,您必须将目标定位为操作系统。