You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署GitLab从16.8-ee升级至17.2-ee后用户数据丢失求助

问题描述

Docker部署的GitLab EE从16.8版本直接升级到17.2版本(未遵循版本跳跃升级路径),启动新容器后非root用户无法登录,提示凭证无效。通过gitlab-rails console执行用户查询:

User.all.each { |user| puts "#{user.username}: #{user.state}"}

仅返回root用户数据:

root: active
=> [#<User id:1 @root>]

执行的docker run命令存在重复执行、镜像标签不明确的粘贴失误:

sudo docker run --detach --hostname gitlab.example.com --publish 443:443 --publish 8080:80 --publish 122:22 --name gitlab --restart always --volume $GITLAB_HOME/config:/etc/gitlab --volume $GITLAB_HOME/logs:/var/log/gitlab --volume $GITLAB_HOME/data:/var/opt/gitlab --volume /srv/gitlab/config/ssl/gitlab.crt:/etc/gitlab/ssl/gitlab.crt --volume /srv/gitlab/config/ssl/gitlab.key:/etc/gitlab/ssl/gitlab.key:ro --shm-size 256m gitlab/gitlab-ee:15.11.13-ee.0
sudo docker run --detach --hostname gitlab.tm.jfe-eng.co.jp --publish 443:443 --publish 8080:80 --publish 122:22 --name gitlab --restart always --volume $GITLAB_HOME/config:/etc/gitlab --volume $GITLAB_HOME/logs:/var/log/gitlab --volume $GITLAB_HOME/data:/var/opt/gitlab --volume /srv/gitlab/config/ssl/gitlab.crt:/etc/gitlab/ssl/gitlab.crt --volume /srv/gitlab/config/ssl/gitlab.key:/etc/gitlab/ssl/gitlab.key:ro --shm-size 256m <gitlab image>

操作时仅挂载原有数据卷,未创建新卷,怀疑数据异常与容器删除/升级路径错误有关。

排查方向
  • 卷挂载验证:确认$GITLAB_HOME/data路径是否指向原有PostgreSQL数据目录,新容器是否未正确挂载旧卷(比如路径拼写错误、匿名卷覆盖)。
  • 迁移日志检查:查看容器内/var/log/gitlab/gitlab-rails/migration.log和/var/log/gitlab/postgresql日志,排查数据库迁移失败、数据损坏报错。
  • 版本兼容性:GitLab要求按次要版本逐步升级(16.8→16.9→…→17.0→17.1→17.2),跨大版本直接升级可能导致数据库迁移不完整。
  • 卷权限问题:容器删除后,新容器运行用户(git/998UID)是否对挂载卷有读写权限,权限不足可能触发初始化流程覆盖数据。
解决步骤

1. 紧急备份现有数据

立即停止当前容器并备份所有卷数据,避免二次损坏:

sudo docker stop gitlab
sudo tar -czf gitlab_data_backup_$(date +%Y%m%d).tar.gz $GITLAB_HOME/config $GITLAB_HOME/data $GITLAB_HOME/logs

2. 验证PostgreSQL数据完整性

启动临时PostgreSQL容器挂载原有数据卷,直接查询用户表:

sudo docker run --rm -v $GITLAB_HOME/data/postgresql/data:/var/lib/postgresql/data -e POSTGRES_USER=gitlab -ti postgres:16 psql -U gitlab gitlabhq_production

执行SQL查询:

SELECT username, state FROM users;
  • 若能查到其他用户:说明数据未丢失,是GitLab应用层加载问题,可回退版本后重新升级。
  • 若仅返回root:说明数据已损坏,需依赖备份恢复。

3. 按正确路径重新升级(数据未损坏时)

先回退到16.8-ee版本,确认所有用户正常:

sudo docker run --detach --hostname gitlab.tm.jfe-eng.co.jp --publish 443:443 --publish 8080:80 --publish 122:22 --name gitlab --restart always --volume $GITLAB_HOME/config:/etc/gitlab --volume $GITLAB_HOME/logs:/var/log/gitlab --volume $GITLAB_HOME/data:/var/opt/gitlab --volume /srv/gitlab/config/ssl/gitlab.crt:/etc/gitlab/ssl/gitlab.crt --volume /srv/gitlab/config/ssl/gitlab.key:/etc/gitlab/ssl/gitlab.key:ro --shm-size 256m gitlab/gitlab-ee:16.8-ee.0

等待容器完全启动(日志出现GitLab is up and running),验证用户正常后,按以下步骤逐步升级:

  1. 16.8-ee → 16.9-ee
  2. 16.9-ee → 17.0-ee
  3. 17.0-ee → 17.1-ee
  4. 17.1-ee → 17.2-ee
    每一步都需等待容器启动完成、数据库迁移结束。

4. 修复卷权限(若为权限问题)

回退到16.8版本后,检查并修复卷权限:

# 确认GitLab容器内git用户UID/GID
sudo docker exec gitlab id git
# 通常为998:998,执行权限修复
sudo chown -R 998:998 $GITLAB_HOME/data $GITLAB_HOME/config

修复后再按正确路径升级。

5. 数据损坏后的恢复

若PostgreSQL中无其他用户数据,从备份恢复:

  • 使用GitLab内置备份:将备份文件放入$GITLAB_HOME/data/backups,修改权限后执行恢复:
    sudo chown git:git $GITLAB_HOME/data/backups/<备份文件名>
    sudo docker exec -ti gitlab gitlab-backup restore BACKUP=<备份文件名前缀>
    sudo docker exec gitlab gitlab-ctl reconfigure
    
  • 使用卷备份:解压之前的备份覆盖现有卷:
    sudo rm -rf $GITLAB_HOME/config $GITLAB_HOME/data $GITLAB_HOME/logs
    sudo tar -xzf gitlab_data_backup_xxxxxx.tar.gz -C /
    
    启动16.8版本容器验证数据正常后,再按正确路径升级。

内容的提问来源于stack exchange,提问作者user26585326

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:57:10