Docker:导出多种架构的镜像

Jor*_*dan 7 docker docker-registry

我有一个场景,我需要以可导出、可传输的格式捆绑一个多容器系统。具体来说,我需要从 Docker Hub 获取图像并将其存储在便携式介质(例如 USB 驱动器)上,然后我可以将其加载到无法访问互联网的气隙计算机中。

我通常可以这样做:

# On the development server
docker pull nginx:1.23
docker save -o nginx.tar nginx:1.23

... store the .tar on portable media...

# On the air-gapped machine
docker load < myimage.tar
Run Code Online (Sandbox Code Playgroud)

然而,尽管该映像是为多种体系结构构建并支持多种体系结构,但这似乎只存储单个体系结构(运行 的计算机的体系结构docker pull)的映像。我需要它将所有架构的图像导出到.tar文件,以便它们可以加载到任何架构的机器上。

我试过了:

docker pull --platform linux/amd64 nginx:1.23
docker pull --platform linux/arm64 nginx:1.23
Run Code Online (Sandbox Code Playgroud)

手动指定应该拉取amd64arm64图像,但docker save仍然只导出单个图像(我们可以从文件manifest.json只有一个条目的事实看出)。

我也尝试过:

docker pull --platform linux/amd64 --platform linux/arm64 nginx:1.23
Run Code Online (Sandbox Code Playgroud)

但它有相同的结果。

当我导出/保存支持多种不同架构的图像时,如何导出/docker load保存?理想情况下,我能够在任何支持的体系结构的计算机上使用docker load单个.tar文件,让它导入该体系结构的映像,然后运行该映像。

编辑:

经过进一步的测试,我发现如果我执行以下操作:

docker pull --platform linux/amd64 nginx:1.23
docker save -o nginx.tar
Run Code Online (Sandbox Code Playgroud)

然后该.tar文件有一个manifest.json带有单个图像(对于amd64)。但是,如果我这样做:

docker pull --platform linux/arm64 nginx:1.23
docker save -o nginx.tar
Run Code Online (Sandbox Code Playgroud)

然后该.tar文件有一个manifest.json包含两个图像(用于amd64arm64)。

但这并不是“你必须同时拉动两者”的问题。如果我amd64一次又一次地拉出该版本docker save,我们就会回到manifest.json. 拉动的顺序似乎确实很重要。

T14*_*145 9

关于极其优越的 DevOps SE 的帖子中可以看出:

关于多平台 docker 构建的 Docker 博客文章对此进行了解答。对于您的具体情况,您将为您想要的每个平台执行构建和推送,然后创建一个清单文件并推送它。然后就可以进行保存了。它看起来像这样:

$ docker buildx build --platform linux/amd64 --push -t localhost:5000/myimage:amd64 .
$ docker buildx build --platform linux/arm64 --push -t localhost:5000/myimage:arm64 .
$ docker manifest create myimage:latest myimage:amd64 myimage:arm64
$ docker manifest push localhost:5000/myimage:latest
$ docker image save -o myimage.tar localhost:5000/myimage:latest
Run Code Online (Sandbox Code Playgroud)