我正在尝试在作为Jenkins管道的一部分运行的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容器中的第二个调用(和echo)输出:
[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
答案 0 :(得分:4)
只是为了表明我的工作。在mkobits建议中,我在sh命令中添加了两行来编写解决问题的ssh配置文件。
sshagent(['e9f7d09a-7b88-4bf7-814c-464f811d9519'])
{
sh("""
echo $SSH_AUTH_SOCK
mkdir ~/.ssh
echo 'Host *\n StrictHostKeyChecking no' > ~/.ssh/config
ssh -p 7999 git@bitbucket-eng-gpk1.com whoami
""")
}
它可以内置到dockerfile中,但是当我使用共享图像时,这种方式适合我的目的。
编辑:我已添加到dockerfile,所以我们在这里:
RUN useradd -r -u 1000 builder
COPY config /home/builder/.ssh/config
RUN chown builder:builder /home/builder/.ssh/*
USER builder
ENTRYPOINT ["/bin/bash"]
添加非root用户,以便文件不会以root身份留在工作区中。 需要运行chown as和添加的文件以root身份添加。 添加的配置文件是:
Host *
StrictHostKeyChecking no
干杯!
答案 1 :(得分:3)
主机密钥验证失败
容器中的SSH连接无法验证主机(bitbucket-eng-gpk1.com)的身份,这就是失败的原因。当Jenkins提供容器时,它会尝试限制来自外部世界的内容,例如环境变量和安装到该容器中的文件系统位置,以便构建步骤具有隔离。在您的容器中,它在进行连接之前未接受VCS的主机密钥,并且它不是交互式终端,因此它将失败。
有几种不同的方法可以解决这个问题。以下是我能想到的一些问题:
忽略主机密钥检查(了解此问题的安全隐患(1,2)) - 使用StrictHostKeyChecking
选项禁用检查。 UserKnownHostsFile
选项可以用于将接受的密钥管道传送到其他位置。这也可以在~/.ssh/config
文件中按主机完成。
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 7999 git@bitbucket-eng-gpk1.com whoami
将SSH密钥构建到Docker镜像中(脆弱)
~/.ssh/config
文件从主机挂载到容器中