Windows10下Docker部署GitLab遇权限问题无法访问Web界面
我在Windows 10系统中使用以下Docker命令部署GitLab:
docker run --detach --hostname gitlab.example.com --publish 443:443 --publish 80:80 --publish 22:22 --name gitlab --restart always --volume D:\gitlab\config:/etc/gitlab --volume D:\gitlab\logs:/var/log/gitlab --volume D:\gitlab\data:/var/opt/gitlab gitlab/gitlab-ce:latest
当前遇到的问题:在浏览器中访问gitlab.example.com无法显示GitLab的Web界面。查看D:\gitlab\logs\sshd\current日志发现,Docker运行GitLab容器期间持续输出以下权限告警内容:
2018-01-08_13:01:02.92007 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2018-01-08_13:01:02.92010 @ WARNING: UNPROTECTED PRIVATE KEY FILE! @
2018-01-08_13:01:02.92010 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2018-01-08_13:01:02.92010 Permissions 0755 for '/etc/gitlab/ssh_host_rsa_key' are too open.
2018-01-08_13:01:02.92010 It is required that your private key files are NOT accessible by others.
2018-01-08_13:01:02.92011 This private key will be ignored.
2018-01-08_13:01:02.92023 key_load_private: bad permissions
2018-01-08_13:01:02.92198 Could not load host key: /etc/gitlab/ssh_host_rsa_key
(其余同类密钥权限告警内容省略)
请问我的GitLab出现了什么问题?如何恢复Web界面的正常访问?
这个问题的核心是Windows文件系统的权限映射到Linux容器后,SSH私钥文件的权限过于宽松——sshd服务对私钥文件的权限要求非常严格,必须是只有所有者可读可写(权限600),而Windows挂载到Linux容器的文件默认权限通常是0755,导致sshd无法加载密钥,进而卡住了GitLab的启动流程,最终Web界面无法访问。
下面是具体的修复步骤:
1. 停止并移除当前容器
先把出问题的GitLab容器停掉并删除(不用担心数据丢失,因为我们已经把配置、日志、数据都挂载到了本地目录):
docker stop gitlab docker rm gitlab
2. 修改SSH私钥文件的权限
由于Windows本身的权限模型和Linux不兼容,直接在Windows上修改权限没用,我们可以通过临时启动一个Linux容器来调整挂载目录里的密钥权限:
docker run --rm -v D:\gitlab\config:/config ubuntu:latest chmod 600 /config/ssh_host_*_key
这条命令会临时启动一个Ubuntu容器,把本地的D:\gitlab\config挂载到容器内的/config目录,然后把所有以ssh_host_开头的密钥文件权限改成600——这是Linux下私钥文件的标准安全权限,刚好满足sshd的要求。
3. 重新启动GitLab容器
权限调整完成后,用你原来的启动命令重新启动GitLab:
docker run --detach --hostname gitlab.example.com --publish 443:443 --publish 80:80 --publish 22:22 --name gitlab --restart always --volume D:\gitlab\config:/etc/gitlab --volume D:\gitlab\logs:/var/log/gitlab --volume D:\gitlab\data:/var/opt/gitlab gitlab/gitlab-ce:latest
4. 验证修复效果
GitLab启动需要一点时间(大概5-10分钟),等启动完成后,再去查看D:\gitlab\logs\sshd\current日志,确认没有权限告警了,然后访问gitlab.example.com,应该就能正常看到GitLab的Web界面了。
小提示:如果之后还遇到类似的权限问题,尽量不要用--user root启动容器(虽然能临时解决,但会降低安全性),最好还是通过调整挂载文件的权限来解决。
内容的提问来源于stack exchange,提问作者helenDeveloper

