在postgres docker容器中添加自定义的pg_hba.conf文件?

12 浏览
0 Comments

在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被正确识别,并且我可以使用它来限制访问。

0
0 Comments

问题的原因是因为在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中的答案。

0
0 Comments

问题的原因是在docker-compose.yml文件中的db容器中没有将POSTGRES_PASSWORD作为环境变量添加进去,导致postgres无法启动。解决方法是在docker-compose.yml文件中为db容器添加POSTGRES_PASSWORD环境变量,并设置为非空值。

如果仍然出现问题,请提供db容器的日志。

如果不使用pg_hba.conf文件,我可以正常使用postgres并连接到它(我传递了所需的凭据)。我传递了POSTGRES_PASSWORD(在生产环境中,我传递POSTGRES_PASSWORD_FILE),它可以成功连接。

0