Docker Compose重建容器丢失数据库Schema与数据问题求助
解决Docker Compose重建Postgres容器时数据丢失的问题
看起来你遇到的问题很典型——宿主机上的data/postgres目录有文件,但重建容器后数据还是丢了,核心原因大概率是Postgres容器的数据目录挂载配置错误,或者是宿主机目录权限不匹配导致容器实际使用了匿名卷而非你指定的本地目录。下面一步步帮你解决:
1. 检查并修正Docker Compose中的Volume配置
Postgres容器默认将数据存储在/var/lib/postgresql/data路径下,这是你必须映射到宿主机目录的关键路径。如果你的配置里映射的是上层目录(比如/var/lib/postgresql)或者其他错误路径,容器会自动创建匿名卷来存储数据,重建时匿名卷被清理,自然就丢数据了。
正确的Postgres服务配置片段应该是这样的:
version: '3.8' services: postgres: image: postgres:15-alpine # 可替换为你使用的Postgres版本 container_name: my_postgres environment: POSTGRES_USER: your_db_user POSTGRES_PASSWORD: your_db_password POSTGRES_DB: your_default_db volumes: # 重点:将宿主机的./data/postgres映射到容器的默认数据目录 - ./data/postgres:/var/lib/postgresql/data ports: - "5432:5432"
2. 修复宿主机目录的权限问题
Postgres容器内部运行的postgres用户UID通常是999(部分旧版本可能为5432),如果宿主机的data/postgres目录权限不对,容器无法写入,就会自动 fallback 到匿名卷存储数据。
执行以下命令修复权限:
# 先停止容器 docker-compose down # 修改宿主机目录的所有者为容器内的postgres用户UID sudo chown -R 999:999 ./data/postgres # 给目录添加必要的读写权限 sudo chmod -R 700 ./data/postgres
3. 验证挂载是否生效
启动容器后,进入容器检查数据目录是否和宿主机同步:
# 进入Postgres容器 docker exec -it my_postgres bash # 查看容器内数据目录的内容 ls -l /var/lib/postgresql/data
你应该能看到base、pg_hba.conf、postgresql.conf等文件,并且和宿主机data/postgres目录下的文件完全一致。
4. 重新测试重建命令
现在执行你的重建命令:
docker-compose up -d --force-recreate --build
之后连接数据库,你会发现之前的Schema和数据都完好无损——因为数据实际存储在宿主机的data/postgres目录,重建容器只是重新创建了运行环境,并不会影响挂载的本地卷数据。
内容的提问来源于stack exchange,提问作者Xi Tan
相关产品推荐
相关产品推荐

