Postgresql Docker exec-无法使用环境变量调用postgres

Postgresql Docker exec-无法使用环境变量调用postgres,postgresql,docker,Postgresql,Docker,我在Postgres容器上定义了多个环境变量,例如Postgres\u USER。容器正在运行,我想使用exec从命令行连接到Postgres 我无法与以下用户连接: docker exec -it <CONTAINER-ID> psql -U $POSTGRES_USER -d <DB NAME> docker exec-it psql-U$POSTGRES\U USER-d 据我所知,变量是在容器上定义的,并且以下操作有效: docker exec -it <

我在Postgres容器上定义了多个环境变量,例如Postgres\u USER。容器正在运行,我想使用exec从命令行连接到Postgres

我无法与以下用户连接:

docker exec -it <CONTAINER-ID> psql -U $POSTGRES_USER -d <DB NAME>
docker exec-it psql-U$POSTGRES\U USER-d
据我所知,变量是在容器上定义的,并且以下操作有效:

docker exec -it <CONTAINER-ID> bash -c 'psql -U $POSTGRES_USER  -d <DB NAME>'
docker exec-it bash-c'psql-U$POSTGRES\U USER-d'
我有没有办法直接从docker exec执行psql命令并调用容器上的环境变量

docker exec -it <CONTAINER-ID> psql -U ????? -d <DB NAME>
docker exec-it psql-U-D

根据您的用例,您可以做的不是将用户传递给
psql
命令,而是在引导时定义容器的名称

这样,如果您不指定任何用户,它将成为PostgreSQL的默认用户,因此您甚至不必指定它来连接:

$docker run--name postgres-e postgres\u PASSWORD=bar-e postgres\u USER=foo-e PGUSER=foo-d postgres
E250F0821613A5E2021E94772A732F2999874FC7A16B340ADA4233AFE73744423
$docker exec-ti postgres psql-d postgres
psql(12.4(Debian 12.4-1.pgdg100+1))
键入“帮助”以获取帮助。
博士后=#

这对您不起作用的原因是当您运行命令时

docker exec -it <CONTAINER-ID> psql -U $POSTGRES_USER -d <DB NAME>
docker exec-it psql-U$POSTGRES\U USER-d
您正在主机上运行它。因此,$POSTGRES\u USER指的是主机上的环境变量,而不是容器。该变量未在主机上设置

第二个命令

docker exec -it <CONTAINER-ID> bash -c 'psql -U $POSTGRES_USER  -d <DB NAME>'
docker exec-it bash-c'psql-U$POSTGRES\U USER-d'
之所以有效,是因为您正在将引号中的命令传递给容器中的shell,而该变量实际上存在于容器中

第二个命令中的方法是执行您试图执行的操作的方法,除非您以某种方式在主机上设置变量,并确保它与容器中的变量具有相同的值

最简单的方法是在映像构建时引用宿主变量

因此,在Dockerfile中,如果您编写
ENV POSTGRES_USER=${POSTGRES_USER}
,它将在宿主环境中查找并使用该值


如果以这种方式设置变量,则命令将起作用。

'$POSTGRES\U USER'
docker exec-it/bin/bash,然后是psql-d-U谢谢@MikeOrganek,但这仍然会导致错误。我想容器会把它当作一根绳子<代码>psql:错误:无法连接到服务器:致命:角色“$POSTGRES_USER”不存在谢谢@dassum,我编辑了我的问题以包括数据库名称,但这没有解决使用环境变量的问题。对此表示抱歉。那真是一团糟。我现在唯一能让它工作的方法是
sh-c'psql-U$POSTGRES\U USER'
。我认为有必要将其传递给
sh
,以便对环境变量进行评估。如果我找到另一种方法,我会在这里发表评论。谢谢,我在引导时在容器上设置了PGUSER,这很有效。