我正在尝试从Jenkins管道中的Docker容器内部执行SSH命令。我正在使用CloudBees Docker管道插件来旋转容器并执行命令,并使用SSH代理插件来管理我的SSH密钥。这是我的Jenkinsfile的基本版本:
node { step([$class: 'WsCleanup']) docker.image('node').inside { stage('SSH') { sshagent (credentials: [ 'MY_KEY_UUID' ]) { sh "ssh -vvv -o StrictHostKeyChecking=no ubuntu@example.org uname -a" } } } }
SSH命令运行时,出现以下错误:
+ ssh -vvv -o StrictHostKeyChecking=no ubuntu@example.org uname -a No user exists for uid 1005
我仔细查看了日志,发现Docker Pipeline插件通过将UID作为命令行参数传递来自动告诉容器与主机上登录的同一用户一起运行:
$ docker run -t -d -u 1005:1005 [...]
我决定通过cat /etc/passwd在每种环境中运行来检查主机和容器中存在哪些用户。当然,每个用户列表都不相同。1005是主机上的jenkins用户,但是该UID在容器中不存在。为了解决这个问题,我/etc/passwd在旋转主机时将其从主机安装到了容器上:
cat /etc/passwd
/etc/passwd
node { step([$class: 'WsCleanup']) docker.image('node').inside('-v /etc/passwd:/etc/passwd') { stage('SSH') { sshagent (credentials: [ 'MY_KEY_UUID' ]) { sh "ssh -vvv -o StrictHostKeyChecking=no ubuntu@example.org uname -a" } } } }