Docker Compose v2下容器重启后数据卷被覆盖问题求助
解决Docker Compose v2下数据库卷数据丢失问题
核心原因
你的配置中仅挂载了初始化脚本目录,但没有为数据库的核心数据目录配置持久化卷。PostgreSQL默认将数据存储在容器内的/var/lib/postgresql/data路径,WikiJS的SQLite数据通常存储在容器内的/wiki/data路径——如果不挂载这些路径到宿主机或命名卷,容器销毁后数据会随容器层一起被清除。
而docker-compose v1和v2对匿名卷的处理存在差异:v1默认保留匿名卷,v2在服务配置变更或某些场景下会重新创建匿名卷,导致数据丢失。
修复PostgreSQL数据丢失
修改docker-compose.yml的db服务配置,添加命名卷挂载核心数据目录:
services: db: image: postgres:latest volumes: - ./initialization-scripts:/docker-entrypoint-initdb.d/ - postgres-db-data:/var/lib/postgresql/data # 新增:持久化数据库数据 environment: - POSTGRES_PASSWORD=your-db-password # 必须设置密码,否则容器启动失败 # 在文件顶层定义命名卷 volumes: postgres-db-data:
修复WikiJS SQLite数据丢失
同理,为WikiJS添加数据目录的持久化卷:
services: wikijs: image: requarks/wiki:latest volumes: - wikijs-data:/wiki/data # 挂载WikiJS数据目录(包含SQLite文件) # 顶层定义命名卷 volumes: wikijs-data:
关键注意事项
- 执行
docker compose down时不要加-v/--volumes参数,该参数会强制删除所有关联卷。 - 命名卷是Docker管理的持久化存储,不会被
down命令默认删除,跨版本兼容性更好,比绑定挂载更稳定。 - 第一次启动时,容器会自动将初始化数据写入命名卷,后续启动会直接复用已有数据。
内容的提问来源于stack exchange,提问作者Hitsuji
相关产品推荐
相关产品推荐

