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

Managing SSH keys for Capistrano deployments from within a Docker container

我目前使用 Docker Compose(使用基于 ruby:2.4.1 映像的 Docker 文件,据我所知是 Debian)在 运行 中进行测试Ruby 在 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 调用。 运行 这些命令手动修复了问题,所以我认为这是问题的根源。

我发现的所有类似问题的结果都是关于通过 SSHing 进入 Docker 容器,这不是我的问题。还有什么可以尝试的吗?我是不是找错树了?

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

您可以从 here

查看 jenkins ssh-slaves 是如何完成的

在您的情况下,您可能希望将服务器的入口点文件设为 运行 /usr/sbin/sshd

然后您的客户端的入口点文件将 运行 eval $(ssh-agent) && ssh username@server.

密码可以作为机密传递,然后分配给变量。 SSH_ASKPASS="$(cat /run/secrets/password)"