AWS CodeBuild pre_build拉取ECR镜像成功但build阶段报pull access denied错误
问题根因
该报错与IAM权限无关,是docker build命令的--cache-from参数配置错误导致的:
- pre_build阶段你拉取的是带ECR完整域名的镜像:
$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME,该镜像已成功拉取到本地构建环境 - build阶段你给
--cache-from传入的是不带ECR域名的镜像名$IMAGE_REPO_NAME:$IMAGE_TAG,Docker会默认向Docker Hub发起拉取请求,自然会返回权限不足的错误。
修正方案
按以下步骤调整你的buildspec配置即可:
- 首先调整pre_build阶段的拉取逻辑,建议指定固定缓存标签(如
latest),避免拉取到不符合预期的镜像:
- docker pull $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:latest || true
- 修正build阶段的
docker build命令,将--cache-from参数替换为你实际拉取的ECR镜像完整路径:
- docker build --cache-from $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:latest --build-arg BUILD_SECRET_KEY=$SECRET_KEY -t $IMAGE_REPO_NAME:$IMAGE_TAG -f docker/django/Dockerfile .
如果需要沿用原标签逻辑,也可以在pull命令后新增一行打本地标签的命令:docker tag $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:latest $IMAGE_REPO_NAME:$IMAGE_TAG || true,此时--cache-from参数可以保持不变。
额外说明
你遇到的CodeBuild默认缓存15分钟失效的问题,是因为CodeBuild的本地缓存绑定到构建实例,实例空闲超过15分钟就会被系统回收,缓存自然丢失,你选择用ECR镜像作为缓存源的方案是完全可行的,修正配置后即可长期复用Docker层缓存。
内容的提问来源于stack exchange,提问作者Jerven Clark
相关产品推荐
相关产品推荐

