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パッケージパスから分離したい場合は、まずディレクトリを新しい場所にコピーしてください。
$GITLAB_HOMEをターゲットディレクトリに設定します:export GITLAB_HOME=/srv/gitlab sudo mkdir -p $GITLAB_HOMEデータ、ログ、および設定ディレクトリをコピー(または移動)します:
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コピーではなく移動するには、
mvをcp -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:checkLinuxパッケージインスタンスをバックアップし、Dockerインスタンスに復元する
Linuxパッケージインスタンスでバックアップを作成する
Linuxパッケージインスタンスを停止する前に、バックアップを作成します:
sudo gitlab-backup createシークレットファイルを安全な場所にコピーします:
sudo cp /etc/gitlab/gitlab-secrets.json /your/backup/location/詳細については、GitLabをバックアップするを参照してください。
Linuxパッケージインスタンスを停止する
すべてのGitLabサービスを停止します:
sudo gitlab-ctl stopDockerインスタンスをセットアップする
新しいDockerインスタンスをセットアップするには、インストール手順に従ってください。たとえば、ボリューム用に作成するディレクトリに$GITLAB_HOMEを設定します:
export GITLAB_HOME=/srv/gitlabコンテナを一度起動してボリュームディレクトリを初期化し、復元する前に停止します:
docker compose up -d
docker compose stopバックアップを復元する
バックアップアーカイブをDockerデータボリュームにコピーします:
sudo cp <timestamp>_gitlab_backup.tar $GITLAB_HOME/data/backups/シークレットファイルをDocker設定ボリュームにコピーします:
sudo cp gitlab-secrets.json $GITLAB_HOME/config/gitlab-secrets.jsonコンテナを起動し、復元を実行します:
docker compose start docker exec -it <container_name> gitlab-backup restore BACKUP=<timestamp>復元完了後に再設定して再起動します:
docker exec -it <container_name> gitlab-ctl reconfigure docker exec -it <container_name> gitlab-ctl restartインストールを確認します:
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を直接実行します。これにより、メインのコンテナを実行することなく、ボリュームがマウントされた一時的なコンテナが起動され、所有権が修正されます。