【问题标题】:Docker Compose w/ PostgreSQL - psql Password Authentication failed带有 PostgreSQL 的 Docker Compose - psql 密码身份验证失败
【发布时间】:2022-11-30 10:22:24
【问题描述】:

我使用 Docker Compose 和文件内容设置了 PostgreSQL(撰写.yaml)是这样的:

name: postgres-container
services:
  database:
    image: postgres
    restart: always
    environment:
      - POSTGRES_PASSWORD
    // OR POSTGRES_PASSWORD = ${POSTGRES_PASSWORD}
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:

我在终端内运行docker compose up 命令,然后在初始化服务器和数据库后,我尝试使用psql -h localhost -U postgres 连接到 PostgreSQL。

然后它提示我输入密码我在我的 .env 文件中输入了完全匹配的密码在我的项目文件夹中,但我仍然无法进入 PostgreSQL 服务器并给了我错误。

psql: error: connection to server at "localhost" (127.0.0.1), port 5432 failed: FATAL:  password authentication failed for user "postgres"

connection to server at "localhost" (127.0.0.1), port 5432 failed: FATAL:  password authentication failed for user "postgres"

下面是我的 .env 文件:

# When adding additional env variables, the schema in /env/schema.mjs should be updated accordingly

# Prisma
DATABASE_URL=postgres://postgres:postgres@localhost/crud?connect_timeout=10

# Next Auth
NEXTAUTH_SECRET=...
NEXTAUTH_URL=http://localhost:3000

# Next Auth Google Provider
GOOGLE_CLIENT_ID=...
GOOGLE_CLIENT_SECRET=...

# Next Auth Discord Provider
DISCORD_CLIENT_ID=...
DISCORD_CLIENT_SECRET=...

# PostgreSQL Auth
POSTGRES_PASSWORD=postgres

我该如何解决这个问题?我已经做了:

  • 删除存储数据的卷
  • 删除运行的容器
  • 删除 PostgreSQL 映像

当我运行 docker compose convert 命令时,它给了我真正的价值:

name: postgres-container
services:
  database:
    environment:
      POSTGRES_PASSWORD: postgres
    image: postgres
    networks:
      default: null
    restart: always
    volumes:
    - type: volume
      source: pgdata
      target: /var/lib/postgresql/data
      volume: {}
networks:
  default:
    name: postgres-container_default
volumes:
  pgdata:
    name: postgres-container_pgdata

【问题讨论】:

  • 如果您在本地计算机或 postgres 容器中运行 echo $POSTGRES_PASSWORD,它的值是否正确?我不知道你的.env 文件是如何写入你的实际环境变量的
  • @ussu 当我运行echo $POSTGRES_PASSWORD 时,它没有给我任何输出,但我尝试运行docker compose convert 命令,它给了我从 .env 文件中提取的真实值。我在问题中添加了它,以便您可以看到。
  • 我想你可以尝试 exec 进入 postgres 容器并使用\password postgres(用户名)来重置密码。只是为了确定,你从哪里运行 psql 命令?
  • 我在 WSL 内部、容器外部运行命令
  • 你从哪里运行psql?您刚启动的容器不应该给您留下可以运行它的提示。

标签: postgresql docker docker-compose psql


【解决方案1】:

从您的 docker-compose 示例看来,您似乎没有将环境变量 POSTGRES_PASSWORD 设置为任何值。这是真的,还是您只是在帖子中省略了它?

【讨论】:

  • 抱歉,我已经将我的 .env 添加到问题中,您现在可以查看
  • 这不是你从.env文件docs.docker.com/compose/environment-variables/#the-env-file加载环境变量的方式
  • 我已经将compose.yaml 文件更改为POSTGRES_PASSWORD: ${POSTGRES_PASSWORD},但问题仍然存在。
【解决方案2】:

如果你在一个使用 compose 跨越的容器中,试试psql -h database -U postgres
或者,如果您从本地计算机运行 psql,则需要公开服务的端口 5432

  ports:
    - 5432:5423

【讨论】:

  • 是的,我是这样做的,但它让我出错,说密码错误
  • 仍然,您的docker compose convert 的结果没有显示任何列出的端口,您说您是“以这种方式”做的,它是哪种方式?
【解决方案3】:

解决方案:

1. 确保你的 PostgreSQL 容器端口暴露在 Docker Compose 文件中(@ussu 回答)

services:
  db:
    container_name: priority-music-db
    image: postgres
    restart: unless-stopped
    environment:
      - POSTGRES_PASSWORD
      - POSTGRES_USER

    // EXPOSE YOUR PORT HERE
    ports:
      - 5432:5432

    volumes:
      - priority-music-volume:/var/lib/postgresql/data

volumes:
  priority-music-volume:
    name: priority-music-volume

2. 当尝试使用psql 访问数据库时,确保你运行了命令在容器里!

  • 运行docker exec -it <container_name> /bin/bash
  • 现在您在容器内,使用psql -h localhost -U <postgres_username> 命令访问您的 PostgreSQL 服务器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    相关资源
    最近更新 更多