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

时间:2020-02-12 17:16:26

标签: 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

我正在使用以下命令运行它: 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

然后,使用以下命令将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缺少什么吗?

3 个答案:

答案 0 :(得分:6)

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

您需要使用psql标志调用-U Postgres,或者先使用su - Postgres

另请参阅postgresql documentation

答案 1 :(得分:1)

容器假设您尝试使用 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

答案 2 :(得分:0)

我在 docker-compose 文件中为服务指定了 user: postgres。然后删除现有容器以在下一次 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: