解決 Windows Docker 安裝 Gitlab Volume 權限問題

本文首發於個人我的博客,解決 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 系統一個是更明智的選擇。

Reference

  1. GitLab Docker images
  2. Volume trouble with GitLab docker image on Windows
  3. I can not run Gitlab-ce on Docker via Windows if I set "volume" to Windows Shared Drives
  4. Gitlab 備份和遷移
相關文章
相關標籤/搜索