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

Jenkins升级后Docker容器内AWS凭证无法定位问题求助

问题解决:Jenkins 2.375.1 Docker容器内无法继承EC2 IAM角色凭证

核心原因

Jenkins LTS 2.309+版本(含2.375.1)的Docker插件调整了容器环境隔离策略:即使使用reuseNode true,容器默认也无法继承主机的EC2元数据服务访问权限,也不会自动传递AWS临时凭证相关环境变量。而旧版本2.271.1的Docker插件默认允许容器访问主机网络或自动传递这些环境变量,导致升级后出现凭证缺失问题。

解决方法

方法1:让容器共享主机网络(快速生效)

在docker agent块中添加--network host参数,使容器直接使用主机网络,从而能访问EC2元数据服务获取IAM角色凭证:

agent {
   docker {
       image "${MY_IMAGE}"
       reuseNode true
       args "--network host"
   }
}

注意:此方式会消除容器与主机的网络隔离,存在一定安全风险,适合测试环境或信任的镜像。

方法2:手动传递临时凭证到容器(安全推荐)

先在主机阶段获取EC2 IAM角色的临时凭证,再将其作为环境变量注入到Docker容器中:

pipeline {
    agent any
    stages {
        stage('获取AWS临时凭证') {
            steps {
                script {
                    // 从EC2元数据服务获取当前IAM角色名
                    def roleName = sh(script: 'curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/', returnStdout: true).trim()
                    // 获取角色的临时凭证
                    def credsJson = sh(script: "curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/${roleName}", returnStdout: true).trim()
                    def creds = new groovy.json.JsonSlurper().parseText(credsJson)
                    // 获取实例所在区域
                    def region = sh(script: 'curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | grep -oP \'"region": "\K[^"]+\'', returnStdout: true).trim()
                    
                    // 设置全局环境变量
                    env.AWS_ACCESS_KEY_ID = creds.AccessKeyId
                    env.AWS_SECRET_ACCESS_KEY = creds.SecretAccessKey
                    env.AWS_SESSION_TOKEN = creds.Token
                    env.AWS_DEFAULT_REGION = region
                }
            }
        }
        stage('Docker容器内执行AWS操作') {
            agent {
                docker {
                    image "${MY_IMAGE}"
                    reuseNode true
                    environment {
                        // 将主机获取的凭证传递到容器
                        AWS_ACCESS_KEY_ID = "${env.AWS_ACCESS_KEY_ID}"
                        AWS_SECRET_ACCESS_KEY = "${env.AWS_SECRET_ACCESS_KEY}"
                        AWS_SESSION_TOKEN = "${env.AWS_SESSION_TOKEN}"
                        AWS_DEFAULT_REGION = "${env.AWS_DEFAULT_REGION}"
                    }
                }
            }
            steps {
                sh 'aws s3 ls' // 测试AWS CLI命令
            }
        }
    }
}

此方式保持容器网络隔离,仅传递必要的临时凭证,安全性更高。

方法3:调整Jenkins Docker插件配置(全局生效)

进入Jenkins系统管理→全局工具配置→Docker部分,开启"传递主机环境变量"相关选项,可让Docker容器自动继承主机的AWS相关环境变量。注意此为全局设置,会影响所有使用Docker agent的流水线。


内容的提问来源于stack exchange,提问作者geekyM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:05:18