首页 > 解决方案 > 如何使用环境变量通过 PostgreSQL 创建转储?我找到了一个解决方案,但我不知道为什么它不能以另一种方式工作

问题描述

我想创建我的 psql 数据库的转储。我尝试了以下代码

sudo docker exec -t db pg_dump -c -U "$DATABASE_USER" > $BACKUP_DIR/backup$DATE.sql

但我只收到一个错误,它无法连接到数据库“root”

pg_dump: error: connection to database "root" failed: FATAL:  role "root" does not exist

这很好,但我没有在 $DATABASE_USER 中定义 root,所以我想知道它是从哪里来的。经过一番尝试和错误,我找到了一个工作代码。

sudo docker exec -t db pg_dump -c -U $(sudo docker exec -it db /bin/sh -c 'printf $DATABASE_USER') > $BACKUP_DIR/backup$DATE.sql

我在 .env 文件中定义了 $DATABASE_USER 并将其放在我的撰写文件中。

env_file:
    ./.env

编辑:我稍微更改了我的代码,所以我可以更改用户名而无需切换数据库

sudo docker exec -t db pg_dump -c -U $(sudo docker exec -it db /bin/sh -c 'printf $DATABASE_USER') -d $(sudo docker exec -it db /bin/sh -c 'printf $DATABASE_NAME') > $BACKUP_DIR/backup$DATE.sql

标签: linuxpostgresqldockerdocker-composeenvironment-variables

解决方案


发生这种情况的原因是因为在您的主机(即您的笔记本电脑)上没有DATABASE_USER在您的环境中定义。因此,当您输入时:

docker exec -t db <blah> "$DATABASE_USER"

发生变量扩展并且 $DATABASE_USER 被替换为<null>. 由于这会导致pg_dump认为没有提供用户,因此假设当前操作系统用户(容器root内的用户db)将用作 DB 用户。

使用-U $(sudo docker...$DATABASE_USER)作品是因为您以$bash 不会扩展它的方式传递。所以:

$ cat .env 
DATABASE_USER=foo

$ docker exec -it mycontainer echo "$DATABASE_USER"


$ docker exec -it mycontainer bash -c "echo $DATABASE_USER"


$ docker exec -it mycontainer bash -c "echo \$DATABASE_USER"
foo

同样,我相信如果您逃避$,您的pg_dump电话应该可以工作。

披露:我为EnterpriseDB (EDB)工作


推荐阅读