Jenkins Docker环境执行mssh报No user exists for uid 1000问题咨询
报错根因
No user exists for uid 1000是Jenkins调用Docker作为执行agent时的常见适配问题:
- Jenkins启动Docker执行节点时,默认会透传宿主机上Jenkins进程的运行UID(绝大多数场景是1000)进容器,用这个UID执行所有步骤,不会默认切容器内置的root用户
- 你用的
python:3.7基础镜像里没有创建UID=1000的系统用户,而mssh(ec2instanceconnectcli内置的连接工具)启动时会读取/etc/passwd校验当前UID对应的用户条目,找不到匹配记录就直接抛这个错。
修复方案
按使用场景选对应方案即可:
方案1:修改Dockerfile创建匹配UID的用户(生产环境推荐,最稳定)
直接在现有Dockerfile里加创建用户的步骤,提前把UID=1000的用户建好,不需要调整Jenkinsfile配置:
FROM python:3.7 # 创建UID为1000的用户,匹配Jenkins透传的运行身份 RUN useradd -u 1000 -m jenkins RUN pip install ec2instanceconnectcli
提交修改后重新触发流水线,镜像构建完成后即可正常执行mssh命令。
方案2:指定Docker agent用root运行(快速验证适用)
不想改镜像的话,直接调整Jenkinsfile里的dockerfile agent配置,加启动参数强制用root用户进容器执行,绕开UID不匹配问题:
stage('EC2 Connection'){ agent{ dockerfile { true args '-u root:root' } } steps{ withAWS(credentials: '********', region: 'us-east-2') { sh 'mssh ************ --region us-east-2' } } }
注意:该方案下容器内所有操作都以root权限执行,正式生产环境优先选方案1。
方案3:执行命令前临时补全passwd条目(临时排障适用)
如果既不能改镜像也不能改agent启动参数,可以在执行mssh前临时往容器的passwd文件里写入当前UID的用户记录:
steps{ withAWS(credentials: '********', region: 'us-east-2') { sh ''' echo "jenkins:x:$(id -u):0:Jenkins runtime user:/tmp:/bin/bash" >> /etc/passwd mssh ************ --region us-east-2 ''' } }
该方案每次流水线运行都要重复执行写入操作,仅适合临时验证问题用,不建议长期使用。
校验方式
修复后可以在执行mssh前加一行调试命令,确认当前UID能匹配到对应用户:
id && grep $(id -u) /etc/passwd
命令能正常输出用户信息的话,再执行mssh就不会触发该报错。
内容的提问来源于stack exchange,提问作者marcorivera8
相关产品推荐
相关产品推荐

