如何通过Docker启动存储在本地目录中的现有PostgreSQL数据库
问题根因
官方PostgreSQL镜像的入口脚本默认会检测/var/lib/postgresql/data目录状态,只要该目录不包含初始化完成的标识文件,或者你传入了POSTGRES_*开头的初始化专用环境变量,脚本就会自动执行initdb尝试创建新集群,和你已有的非空数据目录冲突就会抛出该报错。
可行解决方案
- 移除初始化专用环境变量
POSTGRES_DB、POSTGRES_USER、POSTGRES_PASSWORD三个参数仅适用于首次启动空白数据目录的场景,挂载已有数据集群时必须删除这三个参数。 - 对齐PostgreSQL大版本
本地数据集群的PostgreSQL大版本必须和镜像版本完全一致,否则会出现兼容性问题无法启动。你可以查看本地数据目录下的PG_VERSION文件确认版本,拉取对应版本的官方镜像即可,例如本地版本为14就使用postgres:14镜像。之前拷贝新数据文件后启动失败,大概率是新文件的版本和你用的镜像版本不匹配。 - 修正本地目录权限
官方PostgreSQL镜像默认使用uid=999、gid=999的postgres用户运行,你需要执行以下命令修改本地数据目录的所有权:
官方镜像不识别sudo chown -R 999:999 /local/path/to/pgdbPUID、PGID环境变量,自行添加这两个参数不会生效。 - 调整后的启动命令
docker run -it --rm \ --name pgdockerdb \ --network pgnet \ -p 5436:5432 \ -v /local/path/to/pgdb:/var/lib/postgresql/data \ postgres:替换为你本地的PG大版本号
你之前尝试的方案无效的原因
/docker-entrypoint-initdb.d目录下的脚本仅在首次初始化空白数据集群时才会执行,挂载已有集群启动时不会触发该目录的脚本执行,因此添加启动命令的脚本不会生效。- 官方PostgreSQL镜像没有适配
PUID、PGID变量,无论传入什么值都不会修改运行用户的uid/gid,因此该操作无效。
内容的提问来源于stack exchange,提问作者Gerbs
相关产品推荐
相关产品推荐

