如何构建推送多平台Docker镜像?已构建arm64镜像处理疑问
问题描述
在x86 Intel笔记本上执行以下命令构建适用于arm64平台的Docker镜像:
docker buildx build . --progress plain --platform linux/arm64/v8 -t myimage:0.4 &> docker-build.log
日志无报错,构建看似成功,但执行docker images或docker image ls都找不到myimage:0.4镜像。
根据Docker文档说明:
在
docker build中,所有构建完成后都会创建容器镜像并导出至docker images。buildx使此步骤可配置,允许将构建结果直接导出至客户端、OCI镜像tar包、镜像仓库等。
其中提到docker导出类型会将单平台结果镜像以Docker镜像规范tar包的形式写入客户端。
我有以下两个问题:
- 如何构建同时支持amd64和arm64的多平台镜像并推送到Docker Hub?是否只能添加
--push参数?或者能否先通过--output tar导出到本地文件,再推送到Docker Hub?(我尝试过--output tar --push,但报错提示不能同时使用local和push!) - 我刚刚构建的arm64镜像是否丢失了?能否现在将其导出为tar包并推送到Docker Hub?
解决方案
问题1:构建多平台镜像并推送到Docker Hub
- 最直接高效的方式是使用
--push参数,同时指定多个目标平台,命令示例:
该命令会在buildx完成多平台构建后,直接将镜像推送到Docker Hub,无需在本地保存镜像。docker buildx build . --platform linux/amd64,linux/arm64/v8 -t [你的Docker Hub用户名]/myimage:0.4 --push - 不能同时使用
--output tar和--push,因为二者属于互斥的输出方式:--output tar是将镜像导出到本地文件(属于local输出类型),而--push是直接推送至远程仓库。若想先本地导出再推送,仅适用于单平台场景——多平台镜像无法导出为单个tar包,若强行拆分操作,需要分别构建单平台镜像、导出tar、加载后推送,再手动创建manifest列表,步骤繁琐且效率低下,远不如直接用--push一步到位。
问题2:找回并处理之前构建的arm64镜像
- 镜像并未丢失,只是buildx默认不会将跨平台构建的结果导入本地Docker镜像列表(这就是
docker images看不到的原因)。你可以重新执行构建命令,添加--output type=docker参数将镜像导出到本地:
执行完成后,再用docker buildx build . --progress plain --platform linux/arm64/v8 -t myimage:0.4 --output type=dockerdocker images即可看到该镜像。 - 若要导出为tar包,使用
--output type=tar,dest=myimage-arm64.tar参数:
得到tar包后,先加载到本地Docker:docker buildx build . --platform linux/arm64/v8 -t myimage:0.4 --output type=tar,dest=myimage-arm64.tar
再推送到Docker Hub:docker load -i myimage-arm64.tardocker tag myimage:0.4 [你的Docker Hub用户名]/myimage:0.4-arm64 docker push [你的Docker Hub用户名]/myimage:0.4-arm64
内容的提问来源于stack exchange,提问作者MsA
相关产品推荐
相关产品推荐

