bash变量似乎无法分配给在容器中执行的psql的输出。

1 人关注

我在一个远程主机上的docker容器中运行Postgres。 我试图通过ssh进入该远程主机,并使用heredoc向该shell传递一个脚本。 在该脚本中,我试图对驻扎在该主机上的容器中的postgres数据库执行psql查询,并将输出分配给一个变量。 我很抱歉,我知道这有点复杂,但也许一些代码会更有条理(也不是)

如果我运行这个,我从$dbVersion的 "echo "中没有得到任何东西......事实上,由于其他一些实验,我相当确信它根本就没有到达 "echo "行,但我不知道为什么,因为......

ssh root@$serverIP13 <<EOF
postgresId=\$(docker ps | grep 'postgres_db' | awk '{print \$1}')
dbVersion=\$(docker exec -i \$postgresId psql -X -A -d myDb  -U myUser -t -c "SELECT Max(Version) FROM DbVersion;")
echo \$dbVersion

...在把我的代码转来转去后...我终于找到了一个可行的方法,我得到了一个成功的版本号的 "回声"。 我对bash很陌生,所以我希望有人能为我解开这个谜团,帮助我更好地理解bash在这方面的工作原理,以及为什么下面的方法能成功,而上面的方法不能。

ssh root@$serverIP13 <<EOF
postgresId=\$(docker ps | grep 'postgres_db' | awk '{print \$1}')
dbVersion=\$(echo "psql -X -A -d myDb -U myUser -t -c 'SELECT Max(Version) FROM DbVersion;'" | docker exec -i \$postgresId bash)
echo \$dbVersion
    
3 个评论
数据库是否在网络上可访问的端口上监听? 如果是的话,从你的本地系统运行 psql -h "$serverIP13" ... 会更容易,跳过 ssh docker exec 这两个步骤。
我一直很欣赏有常识的人!我唯一开放的端口是22,因为我正试图限制我的接触,但是......。我打算把这个添加到我积压的事情中,以便在未来的冲刺阶段尝试做,因为......这是更简单的解决方案,而更简单的解决方案不太可能被破坏。 谢谢你的建议。
ssh -L 5432:localhost:5432 root@$serverIP13 在ssh连接上进行端口转发也会有帮助。 这需要几个网络跳转,但会让你使用本地的 psql 客户端。
linux
bash
postgresql
docker
ssh
JesusIsMyDriver.dll
JesusIsMyDriver.dll
发布于 2020-08-11
2 个回答
VonC
VonC
发布于 2020-08-11
已采纳
0 人赞同

获得docker exec -i输出的正常方法是调用docker运行一个shell(它反过来运行你的命令。
See " Bash / Docker执行:从容器内重定向文件 " (I mentioned in 2015)

dbVersion=\$(docker exec -i sh -c '\$postgresId psql -X -A -d myDb  -U myUser -t -c "SELECT Max(Version) FROM DbVersion;"')
    
等我今晚回到网上,我就试试这个。这似乎是我正在寻找的 "原因"。
Philippe
Philippe
发布于 2020-08-11
0 人赞同

以下脚本无需调用bash就能工作。

ssh root@$serverIP13 << 'EOF'
postgresId=$(docker ps | grep 'postgres_db' | awk '{print $1}')
dbVersion=$(docker exec $postgresId psql -X -A -d postgres -U postgres -c "select current_database()")
echo $dbVersion

我使用'EOF'来避免不得不逃跑。

要把本地的值传递给远程的: