Postgres和Docker Compose; 密码验证失败且角色“postgres”不存在。无法从pgAdmin4连接。

10

我有一个docker-compose文件,如下启动psql数据库,目前我正在尝试使用pgAdmin4连接它(不在docker容器中),并且能够查看它。 我一直在尝试验证数据库,但我不明白原因。

docker-compose内容:

version: "3"

services:
  # nginx and server also have an override, but not important for this q.
  nginx:
    ports:
      - 1234:80
      - 1235:443
  server:
    build: ./server
    ports:
      - 3001:3001 # app server port
      - 9230:9230 # debugging port
    env_file: .env
    command: yarn dev
    volumes:
      # Mirror local code but not node_modules
      - /server/node_modules/
      - ./server:/server
  
  database:
    container_name: column-db
    image: 'postgres:latest'
    restart: always
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: postgres # The PostgreSQL user (useful to connect to the database)
      POSTGRES_PASSWORD: root # The PostgreSQL password (useful to connect to the database)
      POSTGRES_DB: postgres # The PostgreSQL default database (automatically created at first launch)
    volumes:
      - ./db-data/:/var/lib/postgresql/data/

networks:
  app-network:
    driver: bridge

我输入命令 docker-compose up 后查看日志,显示可以连接。我打开pgAdmin并输入以下信息:

first screen

second screen

其中密码为root,但是出现了以下错误:

FATAL:  password authentication failed for user "postgres"

我检查了Docker日志,发现
DETAIL:  Role "postgres" does not exist.

我不确定我做错了什么,按照文档,超级用户应该使用这些规格创建。我是否漏掉了什么?我已经为此苦苦思索了一个小时了。任何帮助都将不胜感激!


我也尝试进入Docker容器并检查Postgres,但它说我不能在root模式下运行它。 - OmegaNalphA
同时在其下面也不断看到这个错误 Connection matched pg_hba.conf line 100: "host all all all scram-sha-256" - OmegaNalphA
10
因为你正在使用映射卷,所以只有在该卷为空时才会创建数据库。否则,它会重复使用找到的数据库。如果该数据库是在不同的POSTGRES_USER设置下创建的,则它将没有你期望的用户。 - jjanes
@jjanes 感谢您的回复!我现在不在电脑旁,但等我回来后会尝试一下。我认为这会有所帮助,因为音量部分是与命令行docker命令唯一的区别。这就是我遵循docker-compose说明所得到的结果。 - OmegaNalphA
4个回答

14

@jjanes在评论中解决了这个问题,我使用了映射卷并且没有正确设置数据库。删除了该卷,现在一切正常。


创建新卷后,问题已解决 :) 谢谢。 - Abdulwahab Alweban

0
原因是@jjanes的评论:
由于您正在使用映射卷,只有在该卷为空时才会创建数据库。否则,它会重用找到的数据库。如果该数据库是在不同的POSTGRES_USER设置下创建的,那么它将没有您期望的用户。
有两种方法可以解决这个问题:
修改pg_hba.conf文件底部的配置:
更改:

# host all all all scram-sha-256
 host all all all md5

或者,当启动Docker容器时,通过添加以下内容来修改配置:

POSTGRES_INITDB_ARGS="--auth-host=scram-sha-256"

这使得生成的密码默认使用scram-sha-256加密进行身份验证。

0
在我的情况下,这是一个权限问题。
目录的所有者和组被错误地更改了。
我将其更改回我的用户(lcompare)和组(lcompare),然后它就可以工作了。
sudo chown lcompare:lcompare db

0
抱歉,我只能提供翻译文本,不提供解释。对于我的五分钱感到抱歉。我曾经遇到过同样的问题,在docker镜像postgres:14.7-alpine上。尽管清除卷并没有帮助,但我注意到在docker-compose.yaml文件中对postgres服务的端口进行注释并清除卷可以解决问题。也许这是postgres数据库初始化逻辑的问题。
    # ports:
    #  - 5432:5432

只有在尝试在主机上打开端口5432以进行内部应用程序连接时,才需要端口。这并不是必要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接