从Docker容器中管理Capistrano部署的SSH密钥

时间:2018-01-23 18:07:58

标签: ruby-on-rails bash docker ssh capistrano

我目前使用Docker Compose(带有基于ruby的Dockerfile:2.4.1图像,我理解为Debian)在Ruby on Rails应用程序中运行测试。

我也想从容器内部署。但是,从远程服务器访问GitLab服务器时,部署(从Docker容器内部)失败:

cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as appuser@app.staging: git exit status: 128
git stdout: Nothing written
git stderr: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

据我所知,SSH代理没有在容器中运行,因此没有被转发到远程服务器,但我似乎无法修复它。

如果我使用docker-compose run app bash登录容器并运行ssh app.staging,它会成功连接,甚至使用/root/.ssh/config中定义的用户,因此显然正在读取配置。

AgentForwarding yes在容器中的/root/.ssh/config中设置(并且未在/etc/ssh/config中覆盖),并且AllowAgentForwarding yes在远程服务器上的/etc/ssh/sshd_config中设置。

我尝试将eval $(ssh-agent -s) && ssh-add /root/.ssh/id_rsa添加到容器上的/etc/profile/root/.bashrc,但它们似乎都没有被Capistrano或Bash调用。手动运行这些命令可以解决问题,所以我认为这是问题的根源。

我发现的类似问题的所有结果都是将 SSH连接到 Docker容器,这不是我的问题。还有什么可以尝试的吗?我吠叫错了树吗?

1 个答案:

答案 0 :(得分:1)

可能是在容器运行之后才初始化服务。您可以创建一个入口点以在运行cmd之前运行特定命令。

你可以看看jenkins ssh-slaves是如何完成的here

在您的情况下,您可能希望让服务器的入口点文件运行(IO String)

然后客户端的入口点文件将运行/usr/sbin/sshd

密码可以作为秘密传递,然后分配给变量。 eval $(ssh-agent) && ssh username@server