本文首发于个人我的博客,解决 Windows Docker 安装 Gitlab Volume 权限问题 ,欢迎访问!linux
记录一下 Windows10 下 Docker 安装 Gitlab 的步骤。nginx
Caution: We do not officially support running on Docker for Windows. There are known issues with volume permissions, and potentially other unknown issues. If you are trying to run on Docker for Windows, please see our getting help page for links to community resources (IRC, forum, etc) to seek help from other users.git
首先,Gitlab 官方是不支持 Windows 下部署 Gitlab 镜像的,因此正常的 Gitlab 服务仍是部署在 Linux 上比较好。本地部署只是用于我的开发测试环境。web
问题描述
其实搭建 Gitlab 本省是一件很简单的事情,直接 pull 官方的 Gitlab 镜像开起来就能够用了。docker
docker run --detach \ --hostname gitlab.example.com \ --publish 443:443 --publish 80:80 --publish 22:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab \ --volume /srv/gitlab/logs:/var/log/gitlab \ --volume /srv/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest
在 Windows 下咱们把 volume 配置成本地路径运行后会出现一下错误:shell
Error executing action create on resource 'storage_directory[/var/opt/gitlab/git-data]
经过查找,这应该是权限不足,致使 Windows 下的 volume 映射存在一些问题。windows
解决方法
别人探索出目前可用的方法是采用 volume 数据卷挂载的形式。ruby
首先先安装 Docker for Windows。并在 Setting 中设置 Shared Drives,设置一会用于挂载 docker 镜像的 volume 的磁盘。bash
而后初始化配置文件路径和 volume。ssh
mkdir D:\docker\gitlab\config mkdir D:\docker\gitlab\backups docker volume create gitlab-logs docker volume create gitlab-data
而后直接建立一个 Container 运行就能够了。
docker run --detach ` --name gitlab ` --restart always ` --hostname localhost ` --publish 10443:443 --publish 10080:80 --publish 1022:22 ` --volume D:\docker\gitlab\config:/etc/gitlab ` --volume gitlab-logs:/var/log/gitlab ` --volume gitlab-data:/var/opt/gitlab ` gitlab/gitlab-ce
等待一段时间初始化后,就能够访问本地的 10080 端口了,http://localhost:10080
打开后就是正常 Gitlab 的页面,重置一下 root 的密码就能够正常使用了。
使用 Docker-Compose 部署(推荐)
若是在运行 Docker 容器时须要配置不少的参数,显然一遍遍输入 docker run
会比较麻烦,这里能够采用三剑客当中的 Docker-Compose 来进行容器的管理和建立(安装 docker-ce 时默认安装)。暂时无论 Docker-Compose 的其余用法,其实就是把命令运行改为了文件运行而已。
Docker-Compose 是经过文件来建立 Docker Container 的。咱们须要在一个目录下建立 docker-compose.yml
文件,写入相应的配置文件。如今咱们把上面的命令进行改造:
# Compose file 版本号,和 docker 版本号对应。3 支持 docker 1.13.0+ version: "3" # services 节点下包含多个待建立的 Docker Container services: # web 节点就是待启动的 gitlab 容器 web: image: gitlab/gitlab-ce:latest container_name: "gitlab" restart: always hostname: localhost:10080 environment: TZ: "Asia/Shanghai" GITLAB_OMNIBUS_CONFIG: | gitlab_rails["time_zone"] = "Asia/Shanghai" gitlab_rails["gitlab_shell_ssh_port"] = 10022 nginx["listen_port"] = 80 ports: - "10080:80" - "10022:22" volumes: - D:\docker\gitlab\config:/etc/gitlab - gitlab-logs:/var/log/gitlab - gitlab-data:/var/opt/gitlab volumes: gitlab-logs: gitlab-data:
能够看到这个文件的内容几乎和以前的 docker run
命令是保持一致的,惟一不一样的是不须要咱们本身建立 volume 了,直接在配置文件中配置后,启动时会本身为咱们建立。
配置完成后,使用 docker-compose 命令运行起来。
# 打开 cmd,进入 docker-compose.yml 的根目录 # 建立容器 docker-compose up -d #关闭容器 docker-compose stop
What's More
1. Web UI 端口显示问题
因为 Gitlab 是在 Docker 内运行的,外部须要访问的话都是须要经过端口映射的,而且通常内部端口不会和映射出来的外部端口相同。因此在用的时候可能会出现一些问题。
例如在咱们例子里,22 映射到 10022,80 映射到 10080。能够看到在 Gitlab 默认的 WebUI 中,项目显示的克隆地址默认是不带端口号的,以下图所示:
所以在进行克隆的时候,不管是 http 仍是 ssh,都须要在 url 中手动添加新的端口,例如
http://localhost:10080/root/demo.git
修改配置文件后能够直接在 WebUI 中显示正确的 url。
具体须要修改 gitlab.rb
和容器内部 /var/opt/gitlab/gitlab-rails/etc/gitlab.yml
。
首先修改 gitlab.rb
# 取消这条配置文件的注释,并修改成外部映射的 ssh 端口 gitlab_rails['gitlab_shell_ssh_port'] = 1022 # 使用 exec 进入容器内部 root@gitlab:/# gitlab-ctl reconfigure
再修改 /var/opt/gitlab/gitlab-rails/etc/gitlab.yml
gitlab: ## Web server settings (note: host is the FQDN, do not include http://) host: 127.0.0.1 port: 10080 # 修改此处 https: false # 修改完后执行 root@gitlab:/# gitlab-ctl stop root@gitlab:/# gitlab-ctl start
这里要注意,后面的那个配置文件是由前面那个生成的,修改 gitlab.rb 后 reconfigure,后面那个配置文件就会被重置了,注意一下修改的顺序。
显然这种方法比较麻烦,且须要进入容器中修改,一旦重启就没了。若是使用 docker-compose 来启动容器的话,能够直接在 environment 的 GITLAB_OMNIBUS_CONFIG 节点中配置,具体配置方式看上面的配置文件。
2. 镜像备份问题
因为使用的是 volume,所以 gitlab 内部的数据直接由 docker 管理了。显然就不太友好。若是有这个需求的能够阅读参考文献 2,里面提到了备份的方法。
总结
总之,Windows 对 Docker 的支持不是很友好,除了下一个学习学习,尝尝鲜,或者用于安装一些 Windows 下没法安装的软件,例如 Redis 等外,并不建议使用,显然选择 linux 系统一个是更明智的选择。