linux - 如何使用环境变量通过 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
解决方案
发生这种情况的原因是因为在您的主机(即您的笔记本电脑)上没有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)工作
推荐阅读
- python - pickle.loads() 的问题 - 输入不足
- javascript - 在我的 Windows 7 32 位终端上尝试 expo-cli 时,我总是遇到错误
- rust - 是否有更短的方法来编写接受和返回闭包的函数签名?
- java - onRequestPermission / onActivityResult Android Studio 出错
- javascript - 使用 Ajax 和 vanilla JS 调用特定的 php 函数
- windows-10 - Windows 10 更改强调色开始菜单和应用程序背景
- android - 如何将滚动视图布局划分为多个固定大小的视图,以便在 Android 中创建多页 PDF
- c# - TypeDescriptor ConvertFromInvariantString 抛出异常?
- neo4j - Neo4J (Cypher) 查询以查找所有不遵循模式的路径
- c# - 在 ASP.NET Core 3.0 MVC 中通过 ViewData 多选发送数据