我正在尝试在作为Jenkins Pipeline一部分运行的docker容器内执行一些git查询。在docker容器外面,sshsgent工作正常,我可以访问我的SCM没问题。在容器内部,我收到主机密钥验证问题。 有人可以帮助我解决我所犯的错误吗?
script { sshagent(['e9f7d09a-7b88-4bf7-814c-464f811d9519']) { sh(""" ssh -p 7999 git@bitbucket-eng-gpk1.com whoami """) } docker.withRegistry('https://dockerhub.banana.com', 'banana-dockerhub-credential') { docker.image('banana_release_base').pull() docker.image('banana_release_base').inside( ''' -v /system:/system -v /tmp:/tmp --privileged -u 0 ''' ) { sshagent(['e9f7d09a-7b88-4bf7-814c-464f811d9519']) { sh(""" echo $SSH_AUTH_SOCK ssh -p 7999 git@bitbucket-eng-gpk1.com whoami """) } } } }
首先whoami呼叫输出:
[docker_git_test] Running shell script + ssh -p 7999 git@bitbucket-eng-gpk1.com whoami d42967b44abe31d6
docker容器输出中的第二个调用(和回显):
[docker_git_test] Running shell script + echo /tmp/ssh-dSoDZMggpAU1/agent.13 /tmp/ssh-dSoDZMggpAU1/agent.13 + ssh -p 7999 git@bitbucket-eng-gpk1.com whoami Host key verification failed
主机密钥验证失败
容器中的SSH连接无法验证主机(bitbucket-eng- gpk1.com)的身份,这就是失败的原因。当詹金斯(Jenkins)设置一个容器时,它试图限制外界的东西数量,例如环境变量和它安装到该容器中的文件系统位置,以使构建步骤具有隔离性。在您的容器中,它在建立连接之前尚未接受VCS的主机密钥,并且它不是交互式终端,因此将失败。
有几种不同的方法来处理此问题。我想到了以下几点:
忽略主机密钥检查(知道这个故事的安全隐患(1,2)) -使用StrictHostKeyChecking选项来禁用检查。该UserKnownHostsFile选项在将接受的密钥通过管道传输到其他位置时很有用。也可以按~/.ssh/config文件中的每个主机进行操作。
StrictHostKeyChecking
UserKnownHostsFile
~/.ssh/config
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 7999 git@bitbucket-eng-gpk1.com whoami
将SSH密钥构建到Docker映像中(易碎)
~/.ssh/config使用主机将文件从主机挂载到容器中