如何合并Docker分开构建的多架构镜像,避免推送时相互覆盖?
多架构镜像分架构构建后合并Manifest方案
完全不需要手动修改Manifest文件,使用Docker原生的manifest子命令即可实现需求,整体流程如下:
步骤1:调整分架构构建的推送规则
首先修改两个架构构建任务的镜像推送逻辑,不要直接推送最终的统一标签,改为推送带架构后缀的临时标签,避免互相覆盖:
- amd64架构构建节点执行命令:
docker buildx build --platform linux/amd64 -t 你的镜像仓库地址/应用名:版本号-amd64 --push . - arm64架构构建节点执行命令:
docker buildx build --platform linux/arm64 -t 你的镜像仓库地址/应用名:版本号-arm64 --push .
步骤2:新增Manifest合并任务
在CircleCI配置中新增一个独立的合并任务,设置任务依赖为两个架构构建任务全部成功后再执行,该任务不需要特殊架构资源,使用任意x86节点即可,执行如下命令:
- (可选)如果Docker版本较旧提示manifest命令不存在,先开启CLI实验特性:
export DOCKER_CLI_EXPERIMENTAL=enabled - 创建Manifest列表,关联两个架构的临时镜像:
docker manifest create 你的镜像仓库地址/应用名:版本号 \ --amend 你的镜像仓库地址/应用名:版本号-amd64 \ --amend 你的镜像仓库地址/应用名:版本号-arm64 - (可选)如镜像架构识别异常,可手动补充注解:
# 注解arm64架构 docker manifest annotate 你的镜像仓库地址/应用名:版本号 \ 你的镜像仓库地址/应用名:版本号-arm64 \ --os linux --arch arm64 # 注解amd64架构 docker manifest annotate 你的镜像仓库地址/应用名:版本号 \ 你的镜像仓库地址/应用名:版本号-amd64 \ --os linux --arch amd64 - 推送合并后的Manifest到镜像仓库:
docker manifest push 你的镜像仓库地址/应用名:版本号
可选优化
如果不想在镜像仓库保留临时的架构后缀标签,可在Manifest推送完成后调用镜像仓库的删除接口清理对应标签,不影响已经推送的统一多架构标签的使用。
内容的提问来源于stack exchange,提问作者Marcus Ruddick
相关产品推荐
相关产品推荐

