Laravel+Docker-Compose环境下PostgreSQL数据无法持久化求助
解决Docker中PostgreSQL数据丢失问题
排查本地挂载目录权限问题
PostgreSQL容器内部运行的用户是postgres(UID为999),如果本地挂载目录的权限不匹配,容器无法读写数据,会导致每次启动都初始化新数据库。
解决步骤:
- 手动创建本地挂载目录并设置正确权限:
mkdir -p ./storage/app/postgresql/data sudo chown -R 999:999 ./storage/app/postgresql/data - 重新启动容器:
docker-compose down docker-compose up -d
改用Docker命名卷(更可靠)
本地目录挂载(bind mount)容易出现权限或路径问题,改用Docker命名卷可避免此类问题,Docker会自动管理卷的权限和存储。
修改docker-compose.yml中db服务的volumes配置:
services: db: # 其他配置保持不变 volumes: - postgres_data:/var/lib/postgresql/data # 在文件末尾添加命名卷定义 volumes: postgres_data:
执行重启命令:
docker-compose down docker-compose up -d
命名卷的数据会存储在Docker默认存储路径(通常为/var/lib/docker/volumes/),不会因本地目录问题丢失数据。
验证数据持久化
执行迁移后,执行docker-compose down再up -d,进入容器验证数据:
docker exec -it docker-db psql -U ${DB_USERNAME} ${DB_DATABASE} # 在psql中执行查询验证,比如查看迁移表: SELECT * FROM migrations;
额外检查点
- 确保
.env文件中的DB_PASSWORD、DB_USERNAME、DB_DATABASE每次启动时一致,避免容器启动时创建新数据库。 - 查看容器启动日志排查权限错误:
docker logs docker-db
若日志中出现could not open directory "/var/lib/postgresql/data": Permission denied类信息,说明权限问题未解决,回到第一步重新设置权限。
内容的提问来源于stack exchange,提问作者bartz
相关产品推荐
相关产品推荐

