DigitalOcean环境下docker-compose数据库持久化配置失效问题
问题原因
你在当前工作目录创建的符号链接postgres_data对Docker命名卷完全无效。Docker的命名卷由Docker守护进程统一管理,默认存储路径为/var/lib/docker/volumes/<卷名>/_data,不会读取当前工作目录下的同名文件/软链接,因此你的PostgreSQL数据一直存储在Droplet的系统盘而非你挂载的块存储卷,清理容器时如果同时删除了命名卷,数据就会彻底丢失。
解决方法
两种方案二选一即可:
方案1:改用绑定挂载(操作最简单,推荐)
- 首先在持久化卷上创建专属存储目录,配置正确权限(PostgreSQL官方镜像默认运行用户UID为70,必须匹配权限否则会启动失败):
sudo mkdir -p /mnt/volume_fra1_01/postgres_data sudo chown 70:70 /mnt/volume_fra1_01/postgres_data
- 修改
docker-compose.yml配置:将db服务的卷挂载改为绑定挂载,同时删除底部全局的postgres_data命名卷声明
db: image: postgres:12.0-alpine volumes: - /mnt/volume_fra1_01/postgres_data:/var/lib/postgresql/data/ env_file: - ./postgres/.env # 原来底部的volumes.postgres_data声明直接删除即可
- 重新启动服务即可生效:
docker-compose up -d
方案2:为命名卷指定挂载路径(保留原命名卷用法)
如果不想修改服务层的卷挂载配置,可以给命名卷显式指定挂载点到你的持久化卷:
- 先执行上述方案1里的目录创建和权限配置命令
- 修改
docker-compose.yml底部全局的volumes配置:
volumes: postgres_data: driver: local driver_opts: o: bind type: none device: /mnt/volume_fra1_01/postgres_data
- 清理旧的同名命名卷(注意:如果旧命名卷里有需要保留的数据,先执行
docker cp把旧数据拷贝到新目录后再执行以下命令):
docker-compose down -v docker volume prune
- 重新启动服务即可生效:
docker-compose up -d
内容的提问来源于stack exchange,提问作者mehrlicht
相关产品推荐
相关产品推荐

