Docker+Git环境下PostgreSQL初始化非空目录报错的解决方案咨询
解决PostgreSQL Docker容器因挂载目录含.gitignore初始化失败的问题
以下是几种可行的解决方案:
方案一:自定义入口脚本清理目录文件
PostgreSQL初始化要求数据目录为空,我们可以通过自定义入口脚本,在官方入口脚本执行前删除目录中的.gitignore等干扰文件:
- 在项目根目录创建
scripts/clean-data.sh脚本,内容如下:#!/bin/sh # 清理PGDATA目录下的.gitignore和.gitkeep文件 rm -f "$PGDATA/.gitignore" "$PGDATA/.gitkeep" # 调用官方PostgreSQL入口脚本继续执行启动流程 exec /usr/local/bin/docker-entrypoint.sh "$@" - 给脚本添加执行权限:
chmod +x scripts/clean-data.sh - 修改
docker-compose.yml,挂载脚本并指定自定义入口:version: '3' services: db: image: postgres:12.7 volumes: - ./data:/var/lib/postgresql/data - ./scripts/clean-data.sh:/usr/local/bin/clean-data.sh environment: - POSTGRES_PASSWORD=xxxx entrypoint: ["clean-data.sh"]
容器启动时会先清理数据目录中的干扰文件,再执行官方初始化流程,避免目录非空报错。
方案二:使用Docker命名卷替代本地目录挂载
如果不需要直接在本地访问PostgreSQL数据文件,推荐使用Docker命名卷管理数据,彻底避免Git文件与数据库初始化的冲突:
修改docker-compose.yml为:
version: '3' services: db: image: postgres:12.7 volumes: - postgres_data:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=xxxx volumes: postgres_data:
命名卷由Docker负责管理,无需在项目中创建本地data目录,自然不会出现Git相关文件干扰数据库初始化的问题。
方案三:先初始化数据库再挂载本地目录
适合需要本地数据目录的场景,先完成数据库初始化再挂载目录:
- 临时修改
docker-compose.yml,移除本地目录挂载:version: '3' services: db: image: postgres:12.7 environment: - POSTGRES_PASSWORD=xxxx - 启动容器完成初始化:
docker-compose up -d - 将容器内的初始化数据复制到本地data目录:
docker-compose cp db:/var/lib/postgresql/data ./data - 停止并移除容器:
docker-compose down - 恢复原
docker-compose.yml的本地目录挂载配置,此时本地data目录已有完整的数据库初始化文件,PostgreSQL启动时不会再执行initdb,因此可以在data目录下添加.gitignore文件(内容如下),既保留Git对目录的跟踪,又忽略数据文件:/* !.gitignore
内容的提问来源于stack exchange,提问作者RockyDon
相关产品推荐
相关产品推荐

