Ubuntu服务器Docker Compose重启后卷数据丢失问题求助
解决Ubuntu服务器Docker卷重启后数据丢失问题
核心原因分析
Ubuntu服务器上Postgres容器的卷目录权限不匹配,导致容器启动时无法读取原有数据,自动初始化新数据库;或是GitLab Runner用户的Docker操作权限不足,引发卷操作异常。
具体解决步骤
1. 修复Postgres卷目录权限
在GitLab CI部署脚本中加入权限修复步骤,确保容器内的postgres用户(UID/GID为999)能正常访问卷目录:
修改后的deploy脚本:
deploy: stage: deploy script: - echo "Deploying application..." - docker login -u "gitlab-ci-token" -p $CI_JOB_TOKEN $CI_REGISTRY - docker-compose down # 适配Postgres容器内用户权限 - docker run --rm -v content_hunter_volume:/data alpine chown -R 999:999 /data - docker-compose up -d - echo "Application successfully deployed"
2. 赋予GitLab Runner用户Docker操作权限
Shell类型Runner默认使用gitlab-runner用户执行命令,需将其加入docker组以获取完整操作权限:
在服务器上执行以下命令:
sudo usermod -aG docker gitlab-runner sudo systemctl restart gitlab-runner
3. 验证手动操作是否正常
先在服务器上手动执行部署流程,排除CI脚本外的问题:
# 进入项目目录 cd /path/to/your/project docker-compose down docker-compose up -d # 检查数据库数据是否保留 docker exec -it content_hunter_db psql -U postgres -d content_hunter -c "SELECT * FROM your_table;"
如果手动操作数据不丢失,说明问题确实出在CI Runner的权限或脚本步骤上,按前两步调整即可。
4. 可选:改用绑定挂载替代命名卷
若命名卷权限问题难以排查,可改用本地目录绑定挂载,直接控制目录权限:
修改docker-compose.yml的volumes配置:
db: # 其他配置保持不变 volumes: - /opt/postgres-data:/var/lib/postgresql/data/:rw # 移除原命名卷定义 # volumes: # content_hunter_volume: # name: "content_hunter_volume"
然后在服务器上创建目录并设置权限:
sudo mkdir -p /opt/postgres-data sudo chown -R 999:999 /opt/postgres-data
内容的提问来源于stack exchange,提问作者silenzzz
相关产品推荐
相关产品推荐

