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
相关产品推荐
相关产品推荐

