【问题标题】:How can I use an environmental variable to create a dump with PostgreSQL? I found a solution but I don't know why it doesn't work the other way如何使用环境变量通过 PostgreSQL 创建转储?我找到了一个解决方案,但我不知道为什么它不能以其他方式工作
【发布时间】:2020-03-15 02:50:24
【问题描述】:

我想创建我的 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

【问题讨论】:

  • 你能分享DATABASE_USER在你的.env文件中的内容吗?
  • 目前是“DATABASE_USER=openUser”

标签: linux postgresql docker docker-compose environment-variables


【解决方案1】:

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

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

发生变量扩展,$DATABASE_USER 被&lt;null&gt; 替换。由于这会导致pg_dump 认为没有提供任何用户,因此假设当前操作系统用户(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)工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2017-08-14
    相关资源
    最近更新 更多