Docker Compose和Postgres官方映像环境变量

13

实际上,我正在使用以下的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:

然后我通过以下方式在容器中运行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 logs的额外日志:

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 登录但无法成功,然后又说你可以使用 admin 用户登录。你尝试在 .env 文件中使用 admin 用户了吗? - Sergiu
感谢您的关注,@Sergiu。正如我所说,它使用图像中的默认值工作,但这不是我的问题。 - Michele Carino
请在您的Postgres容器内运行env | grep POSTGR命令,可以吗? - Sergiu
你尝试直接指定值了吗(POSTGRES_USER: dbadm等)?不确定,但也许你需要像文档中提到的那样在配置中添加 env_file: .env:https://docs.docker.com/compose/compose-file/#env_file - Borys Serebrov
另一个尝试的方法是:将environment部分向前移动,放置在postgres下面,而不是在services级别上。 - Borys Serebrov
显示剩余11条评论
2个回答

7
根据https://hub.docker.com/_/postgres文档。
警告:只有在使用空数据目录启动容器时,Docker特定变量才会生效;任何预先存在的数据库都将在容器启动时保持不变。

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

enter image description here enter image description here

我认为您的问题在于传递-h参数时。容器内始终为localhost,但在外部您必须传递:
hostname: postgres

在您的docker-compose文件中,需要添加Postgres主机名


使用本地主机可以允许本地连接并完全跳过用户创建。问题在于我如何挂载数据目录。@sergiu - Michele Carino
是的,没错,你只使用本地连接,但是在你的/etc/hosts文件中,你需要添加容器IP和postgres,如下所示:0.0.0.0 postgres然后尝试连接。 - Sergiu
看起来设置环境变量PGDATA会创建一个卷,Postgres将在其中存储数据库二进制文件和配置文件(也可以访问)。然后我挂载一个卷,希望在本地开发期间它在主机上更简单。但是似乎挂载该卷将覆盖所有内容。我错了吗? - Michele Carino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接