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



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

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

但我只得到一个错误,它无法连接到数据库"根">

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

这很好,但我没有在$DATABASE_USER中定义根,所以我想知道它来自哪里。经过一点尝试和错误,我发现了一个工作代码。

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,并将其放入我的compose文件中。

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

之所以会发生这种情况,是因为您的主机(即笔记本电脑(上没有在您的环境中定义DATABASE_USER。因此,当你去键入:

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

变量展开发生,$DATABASE_USER被<null>替换。由于这导致pg_dump认为没有提供用户,因此假设当前OS用户(db容器内的root用户(将被用作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(工作

相关内容

最新更新