Docker compose 和 postgres 官方镜像环境变量

zio*_*tch 10 postgresql psql docker docker-compose

实际上我正在使用以下 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
Run Code Online (Sandbox Code Playgroud)

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

POSTGRES_USER=dbadm
POSTGRES_PASSWORD=dbpwd
POSTGRES_DB=db
Run Code Online (Sandbox Code Playgroud)

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

docker exec -ti postgres bash
Run Code Online (Sandbox Code Playgroud)

在此之后调用命令:

psql -h postgres -U dbadm db
Run Code Online (Sandbox Code Playgroud)

我得到错误:

psql: FATAL:  password authentication failed for user "dbadm"
Run Code Online (Sandbox Code Playgroud)

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

psql -h postgres -U admin database
Run Code Online (Sandbox Code Playgroud)

并插入默认密码“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 Code Online (Sandbox Code Playgroud)

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

小智 7

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

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


Ser*_*giu 3

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

在此输入图像描述 在此输入图像描述

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

容器内部始终是localhost,但是,在外部您必须传递:

hostname: postgres
Run Code Online (Sandbox Code Playgroud)

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