从 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)"
我目前使用 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)"