CodeBuild命令输出赋值变量及推送代码构建Docker镜像至ECR问题
问题解答
1. 在CodeBuild中将命令输出赋值给变量的正确方式
在CodeBuild默认的Shell环境里,要把命令的输出结果赋值给变量,得用命令替换的语法,有两种常用写法:
- 用
$()包裹命令(更推荐,可读性强还支持嵌套) - 用反引号
`包裹命令
比如你原来写的TAG=echo $CODEBUILD_RESOLVED_SOURCE_VERSION | head -c 8是错误的——这会把字符串"echo..."直接赋值给TAG,而不是执行echo命令后的结果。正确写法应该是:
TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | head -c 8)
或者:
TAG=`echo $CODEBUILD_RESOLVED_SOURCE_VERSION | head -c 8`
2. 修复buildspec实现源码推送时构建并上传镜像到ECR
你的buildspec有几处小问题,我帮你修正并完善了,直接用下面的版本就能实现需求:
version: 0.2 env: variables: IMG: "app" REPO: "<<zzzzzzzz>>.dkr.ecr.us-east-1.amazonaws.com/app" phases: pre_build: commands: - echo Logging in to Amazon ECR... # 执行ECR登录命令,--no-include-email是新版本必填参数 - $(aws ecr get-login --region us-east-1 --no-include-email) # 正确赋值TAG:取源码版本前8位作为镜像标签 - TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | head -c 8) - echo Docker image tag: $TAG build: commands: - echo Building the Docker image... # 构建镜像,同时打本地标签和ECR仓库标签 - docker build -t $IMG -t $REPO:$TAG . post_build: commands: - echo Pushing the Docker image to ECR... # 推送镜像到ECR仓库 - docker push $REPO:$TAG # 可选:输出成功信息,方便后续流程排查 - echo Image pushed successfully: $REPO:$TAG
额外注意事项:
- 记得把
<<zzzzzzzz>>替换成你的AWS账号ID - 确保CodeBuild的服务角色已经配置了ECR相关权限,至少需要:
ecr:GetAuthorizationTokenecr:BatchCheckLayerAvailabilityecr:GetDownloadUrlForLayerecr:BatchGetImageecr:InitiateLayerUploadecr:UploadLayerPartecr:CompleteLayerUploadecr:PutImage
docker build命令末尾的.代表用当前目录作为构建上下文,千万别漏掉
内容的提问来源于stack exchange,提问作者Naveen Kerati
相关产品推荐
相关产品推荐

