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),验证用户正常后,按以下步骤逐步升级:
- 16.8-ee → 16.9-ee
- 16.9-ee → 17.0-ee
- 17.0-ee → 17.1-ee
- 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 - 使用卷备份:解压之前的备份覆盖现有卷:
启动16.8版本容器验证数据正常后,再按正确路径升级。sudo rm -rf $GITLAB_HOME/config $GITLAB_HOME/data $GITLAB_HOME/logs sudo tar -xzf gitlab_data_backup_xxxxxx.tar.gz -C /
内容的提问来源于stack exchange,提问作者user26585326
相关产品推荐
相关产品推荐

