Docker构建失败:COPY --from=composer时清单媒体类型不匹配
问题分析与解决方法
问题根源
你遇到的错误是因为AWS CodeBuild使用的Docker/容器运行时版本较旧,不支持OCI格式的镜像清单,而composer官方镜像更新后切换到了OCI格式(application/vnd.oci.image.manifest.v1+json);本地Docker版本较新,天然支持OCI格式,所以本地构建正常。
可行修复方案
方案1:指定composer镜像的具体旧版本
避免使用latest标签,改用一个仍使用Docker v2清单格式的稳定版本,比如composer:2.5(可根据Docker Hub上的composer标签历史选择合适版本)。修改Dockerfile中的对应步骤:
COPY --from=composer:2.5 /usr/bin/composer /usr/local/bin/composer
方案2:升级CodeBuild的环境镜像
将你的CodeBuild项目使用的环境镜像替换为最新的标准镜像,比如aws/codebuild/standard:6.0或更高版本。这些新版本的环境镜像中包含的Docker版本已支持OCI格式的镜像清单,能正常拉取composer的最新镜像。
方案3:手动转换镜像格式并存储到ECR
如果必须使用composer最新版本,可在本地将镜像转换为兼容格式后推送到你的AWS ECR仓库:
- 本地拉取最新镜像:
docker pull composer:latest - 标记镜像为你的ECR地址:
docker tag composer:latest <你的ECR仓库地址>/composer:latest - 推送到ECR:
docker push <你的ECR仓库地址>/composer:latest - 修改Dockerfile中的步骤为:
COPY --from=<你的ECR仓库地址>/composer:latest /usr/bin/composer /usr/local/bin/composer
补充说明
docker manifest inspect composer返回"no such manifest"是因为composer是官方镜像的简称,需要带完整仓库名library/composer,执行docker manifest inspect library/composer才能看到清单信息。
内容的提问来源于stack exchange,提问作者user15638540
相关产品推荐
相关产品推荐

