使用Jenkins+Kaniko上传镜像至AWS遇401授权错误求助
我在使用Jenkins结合Kaniko将Docker镜像上传至AWS ECR时,持续触发401未授权错误。已为IAM用户配置全权限,且在Jenkins中正确声明了凭证,相关代码及错误日志如下:
问题相关代码
Pipeline步骤代码:
steps { checkout scm sh """ echo "{\\\"auths\\\":{\\\"${CI_REGISTRY}\\\":{\\\"auth\\\":\\\"$(printf "%s:%s" "${AWS_ACCESS_KEY_ID}" "${AWS_SECRET_ACCESS_KEY}" | base64 | tr -d '\\n')\\\"}}}" > /kaniko/.docker/config.json cat /kaniko/.docker/config.json export AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID}" export AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY}" /kaniko/executor \ --context=dir://./ \ --custom-platform=linux/amd64 \ --dockerfile=Dockerfile \ --snapshotMode=redo \ --use-new-run \ --destination="${CI_REGISTRY}/${CI_SERVICE}:${TAG_NAME}" \ --cache=true \ --verbosity=debug \ --cache-run-layers """ }
错误日志
Copying file /home/jenkins/agent/workspace/Orbcomm2_teste-jenkins-51/Dockerfile to /kaniko/Dockerfile error checking push permissions -- make sure you entered the correct tag name, and that you are authenticated correctly, and try again: checking push permission for "731353370725.dkr.ecr.us-east-1.amazonaws.com/ci-registry-aws/trackit-satellite:teste-jenkins-51": POST https://731353370725.dkr.ecr.us-east-1.amazonaws.com/v2/ci-registry-aws/trackit-satellite/blobs/uploads/: unexpected status code 401 Unauthorized: Not Authorized [Pipeline] } [Pipeline] // container [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // node [Pipeline] } [Pipeline] // podTemplate [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (End Message) Stage "End Message" skipped due to earlier failure(s) [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // withEnv [Pipeline] End of Pipeline ERROR: script returned exit code 1 Finished: FAILURE
我尝试过命令行登录Docker,仍出现相同授权错误,恳请提供排查思路。
排查思路
验证IAM策略的精准性
即使配置了全权限,也要确认IAM策略是否明确包含ECR操作的必要权限:ecr:GetAuthorizationToken、ecr:BatchCheckLayerAvailability、ecr:GetDownloadUrlForLayer、ecr:BatchGetImage、ecr:InitiateLayerUpload、ecr:UploadLayerPart、ecr:CompleteLayerUpload、ecr:PutImage,且资源指定为目标ECR仓库的ARN(如arn:aws:ecr:us-east-1:731353370725:repository/ci-registry-aws/trackit-satellite)。同时检查策略是否存在IP限制、MFA要求等附加条件,导致权限无法生效。确认AWS凭证有效性
在Jenkins代理节点直接执行以下命令测试凭证:aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 731353370725.dkr.ecr.us-east-1.amazonaws.com若命令失败,说明凭证本身存在问题——可能是Access Key/Secret Key错误、IAM用户被禁用,或缺少
ecr:GetAuthorizationToken权限。修正Kaniko的认证逻辑
Kaniko针对ECR无需手动生成.docker/config.json,它会自动读取AWS环境变量处理认证。当前手动编码Access Key/Secret Key的方式不符合ECR认证规则(ECR需要临时登录令牌而非直接编码密钥)。建议删除写入config.json的步骤,保留环境变量导出即可,修改后的脚本:export AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID}" export AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY}" export AWS_DEFAULT_REGION="us-east-1" # 必须指定ECR所在区域 /kaniko/executor \ --context=dir://./ \ --custom-platform=linux/amd64 \ --dockerfile=Dockerfile \ --snapshotMode=redo \ --use-new-run \ --destination="${CI_REGISTRY}/${CI_SERVICE}:${TAG_NAME}" \ --cache=true \ --verbosity=debug \ --cache-run-layers检查Jenkins凭证注入是否正确
在Pipeline的sh脚本中添加echo "${AWS_ACCESS_KEY_ID:0:4}"(仅输出密钥前几位,避免泄露)或aws configure list,验证环境变量是否正确加载了Jenkins配置的凭证。确认ECR仓库的存在性与名称准确性
检查目标ECR仓库ci-registry-aws/trackit-satellite是否存在于us-east-1区域,且名称完全匹配(ECR仓库名称区分大小写,需确保无大写或特殊字符错误)。排查网络与代理问题
若Jenkins代理处于私有网络或通过代理访问AWS,需确认代理配置允许访问ECR域名(731353370725.dkr.ecr.us-east-1.amazonaws.com),可通过curl https://731353370725.dkr.ecr.us-east-1.amazonaws.com/v2/测试连通性。
内容的提问来源于stack exchange,提问作者Gustavo Cristhian

