You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

构建自定义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 trust
    
  • 00-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

火山引擎 最新活动