当前位置: 首页 > news >正文

250830-Docker从Rootless到Rootful的Gitlab镜像迁移

在这里插入图片描述

1. 需求描述

  • 在A服务器上通过Docker-rootless安装并配置了Gitlab,部署的用户是maintain
  • 现在A服务器有其它用途,需要将上述的Gitlab环境迁移到B服务器上
  • B服务器已安装Rootful的Docker,部署的用户是dev
  • A和B服务器都用之前docker pull下载好的镜像加载,加载方式:
docker load -i gitlab-gitlab-ce-amd64.tar

2. 在服务器 A(rootless 环境,用户是maintain)

  • 容器内路径 + docker cp 绕过宿主机卷权限问题。

2.1 暂停写入并做 GitLab 应用备份

docker exec -it gitlab bash -lc 'gitlab-ctl stop sidekiq && gitlab-ctl stop puma'
docker exec -t gitlab gitlab-backup create
docker exec -t gitlab bash -lc 'ls -lh /var/opt/gitlab/backups/'
# 记住备份文件名,比如:1724908800_2025_08_29_16.11.2_gitlab_backup.tar

2.2 用 docker cp 拷出备份与关键配置

  • 拷贝下面三个文件到当前用户的根目录
# 备份包
docker cp gitlab:/var/opt/gitlab/backups/1724908800_2025_08_29_16.11.2_gitlab_backup.tar ~/ # 必须的两个配置
docker cp gitlab:/etc/gitlab/gitlab.rb ~/ 
docker cp gitlab:/etc/gitlab/gitlab-secrets.json ~/
  • ⚠️:ChatGPT的回复,作者两个服务器不涉及下面的内容
# 如启用 HTTPS,连同证书拷出(如存在)
docker cp -a gitlab:/etc/gitlab/ssl ~/ssl# 如本地启用 Container Registry(非对象存储),一并打包:
docker exec -it gitlab bash -lc 'if [ -d /var/opt/gitlab/registry ]; then tar -C /var/opt/gitlab -cpf /tmp/registry.tar registry; fi'
docker cp gitlab:/tmp/registry.tar ~/ 2>/dev/null || true
  • 恢复 A 上的服务:
docker exec -it gitlab bash -lc 'gitlab-ctl start puma && gitlab-ctl start sidekiq'

2.3 传到 B

scp ~/gitlab-ce-16.11.2-ce.0.tar dev@B:/home/dev/
scp ~/*gitlab_backup.tar dev@B:/home/dev/
scp ~/gitlab.rb ~/gitlab-secrets.json dev@B:/home/dev/
  • ⚠️:ChatGPT的回复,作者两个服务器不涉及下面的内容
[ -d ~/ssl ] && scp -r ~/ssl dev@B:/home/dev/
[ -f ~/registry.tar ] && scp ~/registry.tar dev@B:/home/dev/

3. 在服务器 B(rootful Docker,用户 dev)

3.1 让 dev 能用 docker(如尚未做)

sudo usermod -aG docker dev
# 重新登录 shell(或 newgrp docker)后再继续

3.2 准备目录 & 载入镜像 tar

BASE="/home/dev/Downloads/DockerImages/Gitlab-250819/DockerGitlabEmvs"
mkdir -p ${BASE}/{etc,log,opt,opt/backups}# 加载镜像 tar(或直接 docker pull 同版本也可以)
docker load -i gitlab-gitlab-ce-amd64.tar

3.3 启动“空” GitLab 容器(同版本)

IMG_TAG="gitlab/gitlab-ce"
docker run -itd \-p 5004:80 \-p 5005:22 \-v ${BASE}/etc:/etc/gitlab \-v ${BASE}/log:/var/log/gitlab \-v ${BASE}/opt:/var/opt/gitlab \--restart always \--privileged=true \--name gitlab \--shm-size 1g \${IMG_TAG}# 等 1~2 分钟让它初始化目录结构(可跟日志观察)
docker logs -f gitlab | sed -n '1,120p'

3.4 放入 A 的备份与配置(必要时先编辑 external_url)

# 放备份
mv /home/dev/*gitlab_backup.tar ${BASE}/opt/backups/# 放配置与密钥(覆盖空实例的文件)
mv /home/dev/gitlab.rb ${BASE}/etc/
mv /home/dev/gitlab-secrets.json ${BASE}/etc/
  • ⚠️:ChatGPT的回复,作者两个服务器不涉及下面的内容
# 如有证书
[ -d /home/dev/ssl ] && mv /home/dev/ssl ${BASE}/etc/# 如有 Registry 数据(本地存储)
[ -f /home/dev/registry.tar ] && tar -C ${BASE}/opt -xpf /home/dev/registry.tar# 如果 B 要改访问地址/端口/协议,请编辑 external_url
# 例如:
# sed -i 's|^external_url .*|external_url "http://<B的IP或域名>:5004"|' ${BASE}/etc/gitlab.rb

权限提示:B 是 rootful Docker,卷中文件即使属于 dev 也没关系;容器内是 root,能正常读写。如需“更像原生”,可:

sudo chown -R root:root ${BASE}/{etc,log,opt}

3.5 恢复备份

# 停写
docker exec -it gitlab bash -lc 'gitlab-ctl stop sidekiq && gitlab-ctl stop puma'# 取备份前缀(去掉结尾 _gitlab_backup.tar)# ⚠️:这里直接运行会报错
docker exec -it gitlab bash -lc 'ls -1 /var/opt/gitlab/backups'# 假设前缀是 1724908800_2025_08_29_16.11.2
docker exec -it gitlab bash -lc 'yes yes | gitlab-backup restore BACKUP=1724908800_2025_08_29_16.11.2'

[dev@ServerB DockerGitlabEnvs]$ sudo docker exec -it gitlab bash -lc 'ls -l /var/opt/gitlab/backups/'
[sudo] password for dev:
total 16870420
-rw-------. 1 1004 1005 17275310080 Aug 29 22:31 1756504447_2025_08_29_17.5.0_gitlab_backup.tar

看到了:备份文件在容器里是 -rw------- 1 1004 1005 ... gitlab_backup.tar,属主/属组是 1004:1005,而不是 git:git
GitLab 恢复时会用 git 用户读取备份,所以会 Permission denied。把属主改成 git:git 然后再恢复就行。

按顺序执行(在 B 上):

# 1) 修正备份文件属主与权限(在容器内)
docker exec -it gitlab bash -lc '
id git && \
chown git:git /var/opt/gitlab/backups/*_gitlab_backup.tar && \
chmod 600     /var/opt/gitlab/backups/*_gitlab_backup.tar && \
ls -l /var/opt/gitlab/backups/
'# 2) 停写并恢复(把前缀换成你截图里的那个)
docker exec -it gitlab bash -lc '
gitlab-ctl stop sidekiq && gitlab-ctl stop puma &&
yes yes | gitlab-backup restore BACKUP=1756504447_2025_08_29_17.5.0 &&
gitlab-ctl reconfigure && gitlab-ctl restart
'

3.6 reconfigure & restart

docker exec -it gitlab bash -lc 'gitlab-ctl reconfigure && gitlab-ctl restart'

4. 验证与收尾

# 日志
docker logs -f gitlab# Web 访问
# http://<B的IP或域名>:5004  (如配置了 https 则用 https)# Git over HTTP/SSH
git ls-remote http://<B>:5004/namespace/project.git
git ls-remote ssh://git@<B>:5005/namespace/project.git# CI/CD & Runner
docker exec -it gitlab bash -lc 'gitlab-ctl status'
# 触发 pipeline;如更换了域名/证书,Runner 端按需更新 URL/证书信任

5. 小贴士 / 踩坑预防

  • 镜像架构要一致(A、B 同为 amd64 或同为 arm64);否则用 docker pull 官方多架构镜像更稳。
  • 保持版本一致(你已用镜像 tar;若用 pull 也请用相同 tag)。
  • Container Registry 如走对象存储则无需搬数据;如本地存储务必随同迁移。
  • 防火墙/安全组 放行 5004(HTTP/HTTPS 反代后视情况)和 5005(SSH for Git)。
  • external_url 变更 后一定要 gitlab-ctl reconfigure
http://www.xdnf.cn/news/1396513.html

相关文章:

  • 【Linux】网络安全管理:Netfilter、nftables 与 Firewalld | Redhat
  • Pmp项目管理方法介绍|权威详解与实战指南
  • 【超全汇总】MySQL服务启动命令手册(Linux+Windows+macOS)(上)
  • MYSQL速通(3/5)
  • Linux 830 shell:expect,ss -ant ,while IFS=read -r line,
  • 构建AI智能体:十八、解密LangChain中的RAG架构:让AI模型突破局限学会“翻书”答题
  • Python自定义函数形式参中的*args、**kwargs、*和/
  • STM32G474 IAP 双bank升级的坑
  • WebStorm无法识别@下的文件,但是可以正常使用
  • 【后端数据库】MySQL 索引生效/失效规则 + 核心原理
  • 腾讯云OpenCloudOS 9系统部署OpenTenBase数据库详细教程
  • 【云原生】Docker 搭建Kafka服务两种方式实战操作详解
  • php连接rabbitmq例子
  • 【序列晋升】21 Spring Cloud Gateway 云原生网关演进之路
  • 卷积神经网络项目:基于CNN实现心律失常(ECG)的小颗粒度分类系统
  • HAProxy 负载均衡全解析:从基础部署、负载策略到会话保持及性能优化指南
  • docker命令(二)
  • 现状摸底:如何快速诊断企业的“数字化健康度”?
  • PCIe 6.0 TLP深度解析:从结构设计到错误处理的全链路机制
  • 算法题(194):字典树
  • 从0到1玩转 Google SEO
  • Suno-API - OpenI
  • “FAQ + AI”智能助手全栈实现方案
  • Python从入门到高手9.4节-基于字典树的敏感词识别算法
  • 8月29日星期五今日早报简报微语报早读
  • 轮廓周长,面积,外接圆,外接矩形近似轮廓和模板匹配和argparse模块实现代码参数的动态配置
  • 【C++】掌握类模板:多参数实战技巧
  • 基于Net海洋生态环境保护系统的设计与实现(代码+数据库+LW)
  • MYSQL速通(2/5)
  • 小杰机器视觉(six)——模板匹配