在postgres docker容器中添加自定义的pg_hba.conf文件?
在postgres docker容器中添加自定义的pg_hba.conf文件?
我想将端口5432
公开供外部访问,但在此之前我想将其限制为特定的IP地址,所以我想通过pg_hba.conf
来实现。
如果我使用docker的默认设置,容器之间的通信正常工作(通过指定的网络)。
但是如果我指定pg_hba.conf
:
# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all 127.0.0.1/32 trust # IPv6 local connections: host all all ::1/128 trust # Allow replication connections from localhost, by a user with the # replication privilege. local replication all trust host replication all 127.0.0.1/32 trust host replication all ::1/128 trust host all all all md5
然后尝试使用此pg_hba.conf
文件(实际上是从容器本身直接复制的):
psycopg2.OperationalError: could not translate host name "db" to address: Temporary failure in name resolution
(其中db
是docker-compose.yml中的postgres db服务)。
我的compose文件中有以下内容:
other: # other service that connects to postgres using psycopg2
networks:
- backend
db:
image: postgres:13
command: ["postgres", "-c", "config_file=/etc/postgresql.conf"]
ports:
- 5432:5432 # for external communications
volumes:
- db-data:/var/lib/postgresql/data
- path/to/cfg:/etc/postgresql.conf
- path/to/hba:/etc/postgresql/pg_hba.conf
networks:
- backend
networks:
backend:
然后在postgresql.conf
中我编辑了这行:
hba_file = '/etc/postgresql/pg_hba.conf'
配置中还设置了:listen_addresses = '*'
检查docker网络:
docker network inspect bridge [ { "Name": "bridge", "Id": "fe4fe8b8eb4e0c06d43428eadd2bb3f44a2ac581fe55618b4c70c5c28c107b8d", "Created": "2022-11-26T09:34:03.461094956+02:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.0/16", "Gateway": "172.17.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ]
附注:我检查过
PostgreSQL in Docker - pg_hba.conf to allow access from host to container
以及How can I allow connections by specifying docker-compose host names in postgres's pg_hba.conf file?
但似乎没有任何改变。
更新:
我重新尝试了一次,使用相同的内容。只是指定了pg_hba.conf
,现在我没有收到那个错误。不确定问题是如何解决的。但是pg_hba.conf
被正确识别,并且我可以使用它来限制访问。
问题的原因是因为在postgres docker容器中添加自定义的pg_hba.conf文件时出现了问题。解决方法是将配置文件保持在默认位置(/var/lib/postgresql/data)并恢复hba_file位置的更改。确保文件与容器中的权限和所有权相同:600 postgres:postgres(999:999)。
根据文档,在启动pg时使用自定义配置,命令如下:
$ docker run -d --name some-postgres -v "$PWD/my-postgres.conf":/etc/postgresql/postgresql.conf -e POSTGRES_PASSWORD=mysecretpassword postgres -c 'config_file=/etc/postgresql/postgresql.conf'
其中postgres是镜像名称。应该将"-c"部分重定向到entrypoint。
另外,将自定义配置文件放在数据目录中不是一个好主意,因为该目录由另一个卷用于在容器重新创建时保持数据库的持久性。因此,postgresql.conf也被移动到外部,并使用命令指定其路径。
经过讨论后,可以使用以下方式正确启动pg容器:
command: ["-c", "config_file=/etc/postgresql.conf"]
虽然使用"postgres"作为命令也可以启动Postgres,但这种用法看起来有些奇怪。可以参考stackoverflow中的答案。