背景说明
服役良久的 gitlab 服务容器,需迁移到新机器,环境如下:
类别 | 版本 |
---|---|
docker | 20.10.6 |
gitlab | 14.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 是自带备份/恢复功能的,查阅文档后,按照以下步骤顺利完成迁移🎉
- 在旧容器中进行数据数据备份
docker exec -it gitlab /bin/bash
# 进入容器,执行备份
gitlab-rake gitlab:backup:create
耐心等待备份完成,压缩包保存到数据目录的backups
文件夹下。
- 创建新容器(命令可照抄)
- 将备份文件拷贝到同目录
- 进入新容器,执行恢复命令
# 新容器内执行
# 先给备份文件授权,避免出现解压时权限不足的情况
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!