我目前使用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容器,这不是我的问题。还有什么可以尝试的吗?我吠叫错了树吗?
答案 0 :(得分:1)
可能是在容器运行之后才初始化服务。您可以创建一个入口点以在运行cmd之前运行特定命令。
你可以看看jenkins ssh-slaves是如何完成的here
在您的情况下,您可能希望让服务器的入口点文件运行(IO String)
。
然后客户端的入口点文件将运行/usr/sbin/sshd
。
密码可以作为秘密传递,然后分配给变量。 eval $(ssh-agent) && ssh username@server