正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

LinuxパッケージのGitLabインスタンスをDockerに移行する

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab Self-Managed

既存のLinuxパッケージのGitLabインスタンスを、次のいずれかのアプローチを使用してDockerに移行します:

  • Reuse existing data directories: 既存のデータディレクトリをDockerボリュームパスに移動します。このアプローチを使用して、完全なバックアップと復元のサイクルなしでデータを維持します。
  • Back up and restore: LinuxパッケージインスタンスでGitLabのバックアップを作成し、新しいDockerインスタンスをセットアップして、それに復元する。このアプローチは、必要に応じてロールバックをサポートするクリーンな移行に利用できます。

前提条件

  • Linuxパッケージインスタンス上のGitLabとDockerイメージのバージョンは一致している必要があります。必要に応じて、Dockerに移行する前にLinuxパッケージインスタンスをアップグレードしてください。
  • ターゲットサーバーにDockerがインストールされている必要があります。

既存のデータディレクトリを再利用する

既存のデータディレクトリを再利用して、LinuxパッケージのGitLabインスタンスをDockerに移行する。

Linuxパッケージインスタンスを停止する

すべてのGitLabサービスを停止します:

sudo gitlab-ctl stop

ボリュームディレクトリを準備する

ボリュームディレクトリの準備方法は、Dockerの実行場所によって異なります:

  • DockerがLinuxパッケージインスタンスと同じサーバーで実行されている場合は、既存のディレクトリをコピーせずに直接マウントできます。Docker Composeファイル内のボリュームパスをLinuxパッケージの場所に設定します:

    volumes:
      - '/etc/gitlab:/etc/gitlab'
      - '/var/log/gitlab:/var/log/gitlab'
      - '/var/opt/gitlab:/var/opt/gitlab'
  • 別のサーバーに移動する場合、またはDockerボリュームをLinuxパッケージパスから分離したい場合は、まずディレクトリを新しい場所にコピーしてください。

    1. $GITLAB_HOMEをターゲットディレクトリに設定します:

      export GITLAB_HOME=/srv/gitlab
      sudo mkdir -p $GITLAB_HOME
    2. データ、ログ、および設定ディレクトリをコピー(または移動)します:

      sudo cp -a /var/opt/gitlab $GITLAB_HOME/data
      sudo cp -a /var/log/gitlab $GITLAB_HOME/logs
      sudo cp -a /etc/gitlab     $GITLAB_HOME/config

      コピーではなく移動するには、mvcp -aの代わりに使用します。

コンテナを起動する前に、ホストディレクトリの所有権をroot:rootに変更しないでください。そうすると、コンテナの起動が妨げられ、update-permissionsスクリプトによるその後の所有権の修正も妨げられます。

リポジトリディレクトリが存在し、破損したシンボリックリンクではなく、実際のディレクトリであることを確認します:

ls -la $GITLAB_HOME/data/git-data/repositories

ディレクトリが見つからないか、破損したシンボリックリンクである場合は、作成します:

sudo mkdir -p $GITLAB_HOME/data/git-data/repositories

ユーザーとグループ識別子を調整する

GitLabDockerイメージには、すべてのGitLabディレクトリに正しい所有権を設定するupdate-permissionsと呼ばれる組み込みスクリプトが含まれています。Linuxパッケージインスタンスが、Dockerイメージが想定する固有識別子とは異なる固有識別子(ディストリビューションによって異なるOSのデフォルト、または明示的に設定された値)を使用している場合は、コンテナを開始する前に、ボリュームをマウントした一時的なコンテナからupdate-permissionsを実行します。これにより、最初の起動前に所有権が修正されます:

docker run --rm \
  -v <config_path>:/etc/gitlab \
  -v <logs_path>:/var/log/gitlab \
  -v <data_path>:/var/opt/gitlab \
  --entrypoint /bin/bash \
  gitlab/gitlab-ee:<version> \
  -c "update-permissions"

ボリュームディレクトリを準備するで特定したホストパスに、<config_path><logs_path>、および<data_path>を置き換えます。

GitLabをDockerで起動する

準備したディレクトリをマウントするDocker ComposeファイルまたはDocker Engineコマンドを作成するには、インストール手順に従ってください:

volumes:
  - '$GITLAB_HOME/config:/etc/gitlab'
  - '$GITLAB_HOME/logs:/var/log/gitlab'
  - '$GITLAB_HOME/data:/var/opt/gitlab'

コンテナの起動後、再設定を実行します:

docker exec -it <container_name> gitlab-ctl reconfigure

インストールを確認します:

docker exec -it <container_name> gitlab-rake gitlab:check

Linuxパッケージインスタンスをバックアップし、Dockerインスタンスに復元する

Linuxパッケージインスタンスでバックアップを作成する

Linuxパッケージインスタンスを停止する前に、バックアップを作成します:

sudo gitlab-backup create

シークレットファイルを安全な場所にコピーします:

sudo cp /etc/gitlab/gitlab-secrets.json /your/backup/location/

詳細については、GitLabをバックアップするを参照してください。

Linuxパッケージインスタンスを停止する

すべてのGitLabサービスを停止します:

sudo gitlab-ctl stop

Dockerインスタンスをセットアップする

新しいDockerインスタンスをセットアップするには、インストール手順に従ってください。たとえば、ボリューム用に作成するディレクトリに$GITLAB_HOMEを設定します:

export GITLAB_HOME=/srv/gitlab

コンテナを一度起動してボリュームディレクトリを初期化し、復元する前に停止します:

docker compose up -d
docker compose stop

バックアップを復元する

  1. バックアップアーカイブをDockerデータボリュームにコピーします:

    sudo cp <timestamp>_gitlab_backup.tar $GITLAB_HOME/data/backups/
  2. シークレットファイルをDocker設定ボリュームにコピーします:

    sudo cp gitlab-secrets.json $GITLAB_HOME/config/gitlab-secrets.json
  3. コンテナを起動し、復元を実行します:

    docker compose start
    docker exec -it <container_name> gitlab-backup restore BACKUP=<timestamp>
  4. 復元完了後に再設定して再起動します:

    docker exec -it <container_name> gitlab-ctl reconfigure
    docker exec -it <container_name> gitlab-ctl restart
  5. インストールを確認します:

    docker exec -it <container_name> gitlab-rake gitlab:check

トラブルシューティング

LinuxパッケージのGitLabインスタンスをDockerに移行する際に、以下の問題が発生する可能性があります。

起動後の権限エラー

コンテナが起動しても権限エラーがレポートされる場合は、以下を実行します:

sudo docker exec <container_name> update-permissions
sudo docker restart <container_name>

これは、Linuxパッケージインスタンスが、Dockerイメージが想定する固有識別子とは異なる固有識別子をシステムアカウントに使用した場合に発生します。これを防ぐには、ユーザーとグループ識別子を調整するに記載されているように、開始する前にupdate-permissionsを実行します。

別のインスタンスからデータを再利用する際のエラー

別のインスタンスからデータを再利用する際に、以下の問題が発生する可能性があります。

起動時のstat: missing operandエラー

このエラーは、コンテナがgit-data/repositoriesディレクトリを見つけられない場合に発生します:

stat: missing operand
Expected process to exit with [0], but received '1'
Ran stat --printf='%U' $(readlink -f /var/opt/gitlab/git-data/repositories) returned 1

ホスト上で、不足しているディレクトリを作成し、コンテナを再起動します:

sudo mkdir -p $GITLAB_HOME/data/git-data/repositories
sudo docker restart <container_name>

コンテナがすぐに終了し、再起動ループによってdocker execがブロックされる

コンテナが起動後すぐに終了する場合、調査のためにdocker execを使用したり、update-permissionsを実行したりすることはできません。代わりに、ユーザーとグループ識別子を調整すると同じコマンドを使用してupdate-permissionsを直接実行します。これにより、メインのコンテナを実行することなく、ボリュームがマウントされた一時的なコンテナが起動され、所有権が修正されます。