带有docker compose的postgres给出了致命错误:角色“root”不存在错误

Yar*_*ron 13 postgresql docker-compose

我正在尝试在带有 docker 桌面的本地 Windows 机器上使用 postgres 创建一个简单的演示。
这是我的 yaml docker compose 文件,名为img.yaml:

version: '3.6'

services:

    postgres-demo:
      image: postgres:11.5-alpine
      container_name: postgres-demo
      environment:
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=Welcome
        - POSTGRES_DB=conference_app
      healthcheck:
        test: ["CMD-SHELL", "pg_isready -U postgres"]
        interval: 10s
        timeout: 5s
        retries: 5
      ports:
        - 5432:5432
      volumes:
        - .:/var/lib/my_data
      restart: always

Run Code Online (Sandbox Code Playgroud)

我正在使用以下命令运行它: docker-compose -f img.yaml up 并获得以下输出:

Starting postgres-demo ... done
Attaching to postgres-demo
postgres-demo    | 2020-02-12 17:07:46.487 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres-demo    | 2020-02-12 17:07:46.487 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres-demo    | 2020-02-12 17:07:46.508 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres-demo    | 2020-02-12 17:07:46.543 UTC [18] LOG:  database system was shut down at 2020-02-12 17:07:10 UTC
postgres-demo    | 2020-02-12 17:07:46.556 UTC [1] LOG:  database system is ready to accept connections
Run Code Online (Sandbox Code Playgroud)

然后,使用以下命令将 bash 打开到容器中: docker exec -it d47056217a97 bash
我想查看容器中的数据库,所以我在 bash 中运行命令: psql \dt
并得到错误: psql: FATAL: role "root" does not exist。
尝试使用命令创建数据库:psql> create database conference_app;给出错误:psql: FATAL: role "conference_app" does not exist。
我很困惑。我究竟做错了什么?我的 yaml 缺少什么吗?

Raj*_*Raj 37

我user: postgres在 docker-compose 文件中指定了该服务。然后删除现有容器以在下一次执行时重新旋转它docker-compose up。容器提出了用户“postgres”,所以你只需psql -l要从那里开始(不需要 -U 标志)

这是我的 docker-compose 文件

version: '3.1'
services:
  db:
    image: postgres:12.6-alpine
    restart: always
    container_name: postgres12_6
    user: postgres
    environment:
      - "POSTGRES_PASSWORD=postgres"
      - "ES_JAVA_OPTS=-Xms1024m -Xmx3072m"
    networks:
      - esnet
  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

networks:
  esnet:
Run Code Online (Sandbox Code Playgroud)


小智 17

容器假设您正在尝试使用 root 用户(当前用户)连接到数据库,因为您没有在 docker exec 上指定用户和数据库名称。

以下应该有效:

docker exec -it <container_id/container_name> psql -U <user_name> <database_name>
docker exec -it d47056217a97 psql -U postgres conference_app
Run Code Online (Sandbox Code Playgroud)


Jaf*_*fer 17

如果您还指定了默认数据库以外的数据库,则还应该将其包含在pg_readycmd 中,例如:

    healthcheck:
      test: ["CMD-SHELL", "pg_isready -d db-name -U db-user"]
Run Code Online (Sandbox Code Playgroud)

在上面的代码片段中,我的数据库名称是db-name并使用用户db-user。POSTGRES_DB尽管还设置了&POSTGRES_USER环境变量,但我需要指定这一点。


ric*_*yen 16

如果您不指定PGUSER环境变量,那么psql将假定您要使用当前操作系统用户作为您的数据库用户名。在这种情况下,您以root操作系统用户身份使用,您将尝试以 身份登录root,但该用户在数据库中不存在。

你需要要么打电话psql -U postgres,要么su - Postgres先

另请参阅postgresql 文档

  • 我这样使用它:“环境:PGUSER:postgres”,它对我有用。 (6认同)

Dmi*_*sky 8

正如 richyen回答的那样,您需要设置PGUSER环境变量,即使您已经设置了该POSTGRES_USER变量。这仅仅是因为psql并且pg_isready是两个不同的(尽管相关)程序,它们具有不同的环境查找逻辑(一个查找POSTGRES_USER,另一个查找 \xe2\x80\x93 )PGUSER)。

\n
services:\n  db:\n    image: postgres\n    environment:\n      POSTGRES_USER: me\n      PGUSER: me\n    healthcheck:\n      test: pg_isready\n
Run Code Online (Sandbox Code Playgroud)\n

如果你只想依赖一个变量并且不想用你的数据库用户名“堵漏洞”,你可以将 的值POSTGRES_USER直接放在 healthchecktest命令中:

\n
services:\n  db:\n    image: postgres\n    environment:\n      POSTGRES_USER: me\n    healthcheck:\n      test: pg_isready -U $$POSTGRES_USER\n
Run Code Online (Sandbox Code Playgroud)\n

注意 how$$POSTGRES_USER带有两个美元符号前缀;这是故意的。

\n

之后,您可能还想-d db根据 Christopher Peisert 的回答添加选项。

\n


Chr*_*ert 6

docker-compose v2+ 更新

错误 1 ​​- 致命:角色“root”不存在

正如richyen的回答所述,设置PGUSER环境变量。

注意:POSTGRES_USER单独使用是行不通的。

错误 2 - 致命:数据库“X”不存在

在这种情况下,X通常是环境变量的值PGUSER。

设置PGUSER环境变量后,修复了原来的错误,但引入了新的错误:

致命:数据库“X”不存在

解决方案

修复方法是将数据库主机定义为其自己的 Docker 网络 IP 地址,如下所示:

services:
  server:
    depends_on:
      db:
        condition: service_healthy
  db:
    image: postgres:latest
    healthcheck:
      test: "pg_isready -h db"
      interval: 3s
      timeout: 5s
      retries: 5
Run Code Online (Sandbox Code Playgroud)

这里-h db指的是db服务自己的Docker IP地址。使用此配置,通常不需要将附加标志传递给pg_isready.