Docker部署GitLab后SSH克隆失败问题求助
结合你给出的报错信息和环境配置,核心问题大概率是Docker容器内的sshd服务因权限异常无法正常对外响应请求,我整理了几个针对性的排查和修复步骤:
1. 修复容器内sshd的supervise目录权限
你看到的warning: sshd: unable to open supervise/ok: access denied是关键线索——GitLab的进程管理工具无法访问sshd的supervise目录,导致服务无法正常启动或响应。进入容器修复权限:
# 进入GitLab容器 docker exec -it gitlab /bin/bash # 修复supervise目录的权限 chmod 755 /var/run/supervise/sshd chown root:root /var/run/supervise/sshd # 重启sshd服务 gitlab-ctl restart sshd # 或者直接重启整个容器确保配置生效 exit docker restart gitlab
2. 确认GitLab的SSH端口配置正确
确保GitLab生成的SSH克隆链接使用的是你映射的22端口,进入容器后编辑配置文件:
docker exec -it gitlab vi /etc/gitlab/gitlab.rb
找到并确认以下配置(如果没有就添加):
gitlab_rails['gitlab_shell_ssh_port'] = 22
保存后执行重新配置命令,让修改生效:
gitlab-ctl reconfigure
3. 验证主机端口监听状态
确认主机的22端口确实被Docker代理监听,而非主机自身的sshd(你已经把主机sshd端口改到10022了):
netstat -tulpn | grep 22
正常输出应该显示docker-proxy在监听0.0.0.0:22,如果看到sshd占用22端口,检查/etc/ssh/sshd_config里的Port是否为10022,然后重启主机sshd:
systemctl restart sshd
4. 用详细日志排查连接细节
在本地执行带 verbose 参数的SSH测试,获取更详细的连接过程,定位具体失败环节:
ssh -v git@git.xxxx.com
或者用verbose模式执行克隆命令:
git clone -v git@git.xxxx.com:yphc/dt-dd-miniprogram.git
从日志里你能清晰看到是连接阶段被拦截,还是身份验证环节出了问题。
5. 查看容器内sshd的实时日志
进入容器查看sshd的实时日志,观察连接请求到达后的具体错误信息:
docker exec -it gitlab tail -f /var/log/gitlab/sshd/current
这里会记录所有sshd的请求细节,比如密钥验证失败、权限不足等问题,帮你进一步缩小排查范围。
另外你提到关闭防火墙后报错变化,这说明防火墙开启时可能拦截了连接请求,关闭后请求能到达容器,但因为sshd的权限问题无法完成身份交换,所以才会出现ssh_exchange_identification: Connection closed by remote host——优先修复sshd的权限问题应该能解决核心故障。
内容的提问来源于stack exchange,提问作者EricLin

