我想创建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(工作