构建自定义PostgreSQL Docker镜像:宿主机存储与全IP访问配置
实现自定义PostgreSQL镜像:挂载宿主机存储+允许任意IP访问
嘿,这个需求其实很容易搞定——我来一步步带你实现,既能让PostgreSQL把数据存在宿主机,又能修改配置允许任意IP访问,完全适配你的开发环境,不用考虑安全问题。
1. 准备自定义配置文件
首先在你的工作目录下创建一个config文件夹,用来存放修改后的PostgreSQL配置文件:
postgresql.conf:修改监听地址,让数据库能响应所有IP的请求
# 找到listen_addresses这一行,替换成下面的内容 listen_addresses = '*'pg_hba.conf:添加一条规则,允许任意IP的所有用户访问所有数据库(开发环境直接用trust认证)
# 在文件末尾添加这条规则 host all all 0.0.0.0/0 trust00-config.sh:写个小脚本,让容器初始化时自动替换默认配置(避免初始化过程覆盖咱们的自定义配置)
#!/bin/bash # 把自定义配置复制到PostgreSQL数据目录 cp /tmp/config/postgresql.conf /var/lib/postgresql/data/postgresql.conf cp /tmp/config/pg_hba.conf /var/lib/postgresql/data/pg_hba.conf
2. 编写Dockerfile
基于官方PostgreSQL镜像构建自定义镜像,这样能复用官方镜像的所有基础功能,只加入咱们的自定义配置:
# 可以指定具体版本,比如15-alpine(轻量版) FROM postgres:15-alpine # 把本地config文件夹复制到容器临时目录 COPY ./config /tmp/config # 把初始化脚本复制到官方镜像的初始化目录,容器启动时会自动执行 COPY ./config/00-config.sh /docker-entrypoint-initdb.d/ # 给脚本添加执行权限 RUN chmod +x /docker-entrypoint-initdb.d/00-config.sh # 设置开发环境的默认密码(可以根据自己喜好修改) ENV POSTGRES_PASSWORD=dev123
3. 构建自定义镜像
在工作目录下运行这条命令,构建名为custom-postgres的镜像:
docker build -t custom-postgres .
4. 运行容器并挂载宿主机存储
启动容器时,用-v参数把宿主机的目录挂载到容器的PostgreSQL数据目录,这样数据就会持久化在宿主机上:
docker run -d \ --name dev-postgres \ -p 5432:5432 \ -v /path/on/host/postgres-data:/var/lib/postgresql/data \ custom-postgres
注意:把
/path/on/host/postgres-data换成你宿主机上的实际路径,比如~/dev-postgres-data,如果这个目录不存在,Docker会自动创建。
5. 验证配置是否生效
- 用psql连接数据库测试:
psql -h localhost -U postgres -d postgres - 查看监听地址是否为
*:SHOW listen_addresses; - 从其他机器/不同IP尝试连接数据库,应该能正常访问(因为咱们的
pg_hba.conf允许了所有IP)
补充说明
- 第一次启动容器时,官方镜像会自动初始化数据库,同时咱们的
00-config.sh脚本会把自定义配置复制到数据目录,覆盖默认配置;之后再启动容器,因为数据目录(挂载的宿主机目录)已经存在,不会重新初始化,配置会一直生效。 - 挂载宿主机目录后,即使你删除容器,数据库数据也会保存在宿主机上,下次启动新容器时挂载同一个目录就能继续使用之前的数据。
内容的提问来源于stack exchange,提问作者Mike Stoddart




