【问题标题】:Docker compose and postgres official image environment variablesdocker compose 和 postgres 官方镜像环境变量
【发布时间】:2017-10-15 08:51:48
【问题描述】:

其实我用的是下面的 docker-compose.yml 文件

version: '3.3'

  services:
    postgres:
      container_name: postgres
      image: postgres:latest
      restart: always
      environment:
        POSTGRES_USER: ${POSTGRES_USER}
        POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
        POSTGRES_DB: ${POSTGRES_DB}
        PGDATA: /var/lib/postgresql/data/pgdata
      ports:
        - "5432:5432"
      volumes:
        - ./data/postgres/pgdata:/var/lib/postgresql/data/pgdata

我也在 docker-compose.yml 文件的同一目录中使用这个 .env 文件:

POSTGRES_USER=dbadm
POSTGRES_PASSWORD=dbpwd
POSTGRES_DB=db

然后我以这种方式将 bash shell 运行到容器中:

docker exec -ti postgres bash

然后调用命令:

psql -h postgres -U dbadm db

我得到了错误:

psql: FATAL:  password authentication failed for user "dbadm"

奇怪的是,如果使用默认图像参数:

psql -h postgres -U admin database

并插入默认密码“password”,它让我登录,似乎忽略了环境变量。

我错过了什么?

来自 docker-compose up 日志的其他日志:

postgres    | 2017-10-15 09:19:15.502 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres    | 2017-10-15 09:19:15.502 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres    | 2017-10-15 09:19:15.505 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres    | 2017-10-15 09:19:15.524 UTC [22] LOG:  database system was shut down at 2017-10-15 09:02:21 UTC
postgres    | 2017-10-15 09:19:15.530 UTC [1] LOG:  database system is ready to accept connections

看不到任何关于用户、数据库和密码设置的“RUN”行。

【问题讨论】:

  • 这很令人困惑,您尝试以 dbadm 身份登录,但它不起作用,但您说您可以以管理员身份登录。您是否尝试过在 .env 文件中使用管理员用户?
  • 感谢@Sergiu 的关注,因为我说它可以使用图像中的默认值,但这不是我的问题。
  • 你能运行这个环境吗?在你的 postgres 容器中 grep POSTGR?
  • 您是否尝试直接指定值(POSTGRES_USER: dbadm 等)?不确定,但也许您还需要将env_file: .env 添加到您的配置中,如文档中所述:docs.docker.com/compose/compose-file/#env_file
  • 要尝试的另一件事:将environment 部分向前移动,将其置于postgres 之下,而不是将其置于services 级别。

标签: postgresql docker docker-compose psql


【解决方案1】:

根据https://hub.docker.com/_/postgres 文档。

警告:Docker 特定变量只有在使用空数据目录启动容器时才会生效;任何预先存在的数据库在容器启动时都将保持不变。

【讨论】:

    【解决方案2】:

    我已经使用您提供的详细信息创建了一个 docker-compose yml 和 .env 文件,并且一切正常,如下图所示:

    我认为您的问题在于您传递 -h 参数时。

    容器内部总是localhost,但是外部你必须通过:

    hostname: postgres
    

    在您的 docker-compose 文件中,因此它将具有 postgres 主机名

    【讨论】:

    • 使用 localhost 它允许本地连接并完全跳过用户创建的。问题在于我如何安装数据目录。 @sergiu
    • 是的,您只使用本地连接,但是,在您的 /etc/hosts 文件中,您必须添加容器 IP 和 postgres,如下所示:0.0.0.0 postgres 然后尝试连接
    • 很好,似乎设置环境变量 PGDATA 会在 postgres 存储数据库二进制文件和配置文件(也可以访问)中创建一个卷。然后,为了在本地开发过程中简单起见,我挂载了一个我想在主机上的卷。但是安装卷将覆盖它看起来的一切。我错了吗?
    猜你喜欢
    • 1970-01-01
    • 2016-02-06
    • 2015-06-17
    • 2023-03-03
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多