You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Jenkins+Kaniko上传镜像至AWS遇401授权错误求助

Jenkins + Kaniko 推送AWS ECR报401 Unauthorized排查思路

我在使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:24:56