Docker 以“信任”模式运行 PostgreSQL

问题描述 投票:0回答:3

我目前正在学习 docker 并尝试使用 PostgreSQL 数据库运行 docker 容器。我成功了一次,一切似乎都很顺利。一段时间后,我尝试运行另一个具有几乎相同设置的 Docker 容器,但是,它没有按预期进行。我的问题是,现在,每当我尝试运行 PostgreSQL 容器时,initdb都会以“信任”模式初始化数据库并接受任何无需密码的连接。

到目前为止,我已经尝试从控制台运行命令:

docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 32000:5432 -d postgres:14.5-alpine

以及运行 docker-compose.yaml:

services:
  db:
    container_name: Test_container
    image: postgres:14.5-alpine
    restart: unless-stopped
    ports:
      - "32000:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: mysecretpassword

此外,我尝试以不同的方式订购标签,不同的图像和不同的值,清理docker:删除所有容器,图像和卷,甚至重新安装docker,但是,每当我检查新创建的容器的日志时,我得到:

sh: locale: not found
2022-08-16 09:35:50.709 UTC [30] WARNING:  no usable system locales were found
performing post-bootstrap initialization ... ok
initdb: warning: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
syncing data to disk ... ok

我的一个假设是,由于某种原因,docker 看不到我指定的密码,因此以“信任”模式启动数据库,但是,如果我添加

environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: test_db

docker-compose.yaml,正在创建 test_db 数据库

我很感激有关如何使 docker 运行 PostgreSQL 容器而不是在“信任”模式下运行的任何建议,因为如果指定了密码,默认情况下应该如此。


胡安·冈萨雷斯指出:

注 1:PostgreSQL 映像在本地设置信任身份验证,因此您可能会注意到从本地主机(在同一容器内)连接时不需要密码。但是,如果从不同的主机/容器连接,则需要密码。

因此,根据文档,我更新了我的

docker-compose.yaml 文件:

environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: test_db POSTGRES_HOST_AUTH_METHOD: scram-sha-256 POSTGRES_INITDB_ARGS: --auth-host=scram-sha-256
并再次尝试交换顺序和/或删除 

POSTGRES_INITDB_ARGS

,但数据库仍然以“信任”模式运行。

postgresql docker docker-compose
3个回答
5
投票
正如 @jjanes 在我的问题的评论中指出的那样,解决方案是添加

POSTGRES_INITDB_ARGS: --auth=scram-sha-256

,这将设置本地和主机类型的连接。


1
投票
如 Postgres 的 DockerHub

文档中所述:

注 1:PostgreSQL 映像在本地设置信任身份验证,因此您可能会注意到从本地主机(在同一容器内)连接时不需要密码。但是,如果从不同的主机/容器连接,则需要密码。

但是,如果即使在本地连接中您也不希望使用信任模式,则可以设置

POSTGRES_HOST_AUTH_METHOD

 环境变量来覆盖此行为。更多信息请参阅上述文档。


0
投票
只是想补充说明。 POSTGRES_INITDB_ARGS docker 设置仅用于初始化 postgres DB。我尝试更改设置而不擦除我的持久性 postgres 卷,但没有效果。一旦我擦除了 postgres 数据并且容器重新初始化了文件,pg_hba.conf 就会使用正确的信任设置进行更新。

© www.soinside.com 2019 - 2024. All rights reserved.