docker 迁移 gitlab 代码服务容器

51 阅读1分钟

背景说明

服役良久的 gitlab 服务容器,需迁移到新机器,环境如下:

类别版本
docker20.10.6
gitlab14.0.12
# 容器启动命令,挂载主机 /data/gitlab 目录
docker run -itd \
    --hostname {宿主机 IP} \
    --name gitlab \
    --restart always \
    --volume /data/gitlab/config:/etc/gitlab \
    --volume /data/gitlab/logs:/var/log/gitlab \
    --volume /data/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:14.0.12-ce.0

失败方案

我首先想到的做法,是把数据目录(/data/gitlab)拷贝到新机器,然后启动新容器,结果报错:

STDERR: Rails Error: Unable to access log file. Please ensure that /opt/gitlab/embedded/service/gitlab-rails/log/production.log exists and is writable.

猜测是因为数据命令中,存在旧容器的读写依赖,不兼容新容器。

基于 gitlab 自带功能迁移

碰壁后,想起 gitlab 是自带备份/恢复功能的,查阅文档后,按照以下步骤顺利完成迁移🎉

  1. 在旧容器中进行数据数据备份
docker exec -it gitlab /bin/bash
# 进入容器,执行备份
gitlab-rake gitlab:backup:create

耐心等待备份完成,压缩包保存到数据目录的backups文件夹下。

  1. 创建新容器(命令可照抄)
  2. 将备份文件拷贝到同目录
  3. 进入新容器,执行恢复命令
# 新容器内执行
# 先给备份文件授权,避免出现解压时权限不足的情况
chmod 777 -R /var/opt/gitlab/backups
# 关闭服务,使用gitlab-ctl 命令停止 unicorn(或者puma) 以及 sidekiq 服务
gitlabl-ctl stop puma
gitlabl-ctl stop sidekiq

# 启动恢复,如果备份目录下仅有一个文件,默认就是用该文件
gitlab-rake gitlab:backup:restore

OK!