如何让Docker Postgres容器使用宿主机已有的数据库数据文件
解决方案
1. 基础配置修正
版本匹配要求
首先必须保证Docker使用的Postgres镜像大版本和宿主机原版本完全一致,你宿主机用的是PostgreSQL 13,所以镜像不能直接写postgres,要指定版本:
image: postgres:13
Volume挂载正确格式
Docker bind mount的标准格式是宿主机路径:容器内路径,PostgreSQL官方镜像的默认数据目录为/var/lib/postgresql/data,所以正确的volume配置为:
volumes: - /usr/local/var/postgresql@13:/var/lib/postgresql/data
2. 路径不存在报错解决
你遇到的bind source path does not exist报错,可按以下步骤排查处理:
- 先确认路径拼写正确:你更新2里提到的
/use/local是拼写错误,正确路径开头为/usr - 若使用MacOS Docker Desktop:打开Docker Desktop设置 -> 资源 -> 文件共享,将
/usr/local/var或者完整的/usr/local/var/postgresql@13路径加入允许共享的目录列表,保存后重启Docker即可 - 若使用Linux系统:确认Docker运行用户对
/usr/local/var/postgresql@13目录有读写权限,可执行sudo chmod -R 750 /usr/local/var/postgresql@13 && sudo chown -R 999:999 /usr/local/var/postgresql@13赋权(999是Postgres镜像默认的用户UID) - 如果该路径是软链接,需要挂载软链接指向的真实路径,可执行
readlink -f /usr/local/var/postgresql@13获取真实路径后替换配置
3. 用户名密码配置说明
复用现有数据文件的情况下,不需要额外设置新的用户名密码,沿用你宿主机PostgreSQL原有账号密码即可。如果需要在docker-compose里配置环境变量适配web服务的配置,保持和原宿主机数据库的账号密码一致即可。
重要注意事项
启动Docker版PostgreSQL前,必须先停止宿主机上正在运行的PostgreSQL服务,禁止两个PostgreSQL实例同时读写同一份数据文件,否则会直接损坏数据库数据。
内容的提问来源于stack exchange,提问作者Riri
相关产品推荐
相关产品推荐

