【问题标题】:Variable doesn't expand while passing as a parameter to docker-compose command inside heredoc block作为参数传递给heredoc块内的docker-compose命令时变量不会扩展
【发布时间】:2019-03-12 12:09:33
【问题描述】:

我试图使用下面的 bash 脚本在 ssh 上运行一些 docker-compose 命令。我的意思是我有一个可执行的 shell 脚本 deploy.sh,其中包含以下代码 sn-ps

ssh -tt -o StrictHostKeyChecking=no root@142.32.45.2 << EOF
DIR=test
echo \${DIR}
docker-compose --project-name \${DIR} up -d
EOF

但是 DIR 变量在作为参数传递给 docker-compose 时没有得到扩展。它执行如下。而echo \${DIR} 给出了正确的输出,即test

docker-compose --project-name ${DIR} up -d

【问题讨论】:

  • 将第一行替换为DIR=local; bash &lt;&lt; EOF 是否得到相同的结果?你试过set -x 吗?

标签: bash shell docker unix docker-compose


【解决方案1】:
ssh -tt -o StrictHostKeyChecking=no root@142.32.45.2 <<'EOF'
DIR=test
echo ${DIR}
docker-compose --project-name ${DIR} up -d
EOF

摆脱 \$ - 它会阻止您的变量扩展。但在第二次审查时,我明白这是你的意图。如果您想阻止所有变量扩展,直到您的代码在远程主机上执行,请尝试将 heredoc 单词放在引号中。这样,$ 就会传递给传递给 ssh 的脚本。

作为第二个建议(根据我下面的评论),我会考虑将参数化脚本发送到远程主机,然后执行它(在更改其权限之后)。

# Make script
cat >compose.sh <<'EOF'
#!/bin/bash
DIR=$1
docker-compose --project-name $DIR
EOF

scp -o StrictHostKeyChecking=no compose.sh root@142.32.45.2: 
ssh -o StrictHostKeyChecking=no root@142.32.45.2 chmod +x ./compose.sh \; ./compose.sh test

【讨论】:

  • 请注意,DIR 是在 heredoc 块内声明的。它是一个可执行的 shell 脚本。我的意思是上面的代码在一个可执行文件中。不在街区之外。对不起,你的回答对我没有帮助。不过谢谢
  • FWIW,您可能会发现在 ssh 命令行中添加 -n 对您将来会有所帮助。当我在循环中运行 ssh 时,我遇到了 ssh 占用了我所有的标准输入的问题。您在此处提供的特定示例看起来不需要 -n,但请记住这是一件好事。许多人将 ssh 放入 while 读取循环中浪费了很多时间。
  • 我已经浪费了3天多。尝试了几乎包括您的答案在内的所有内容。但这无济于事。另请注意, echo $DIR 有效,但是将其作为参数传递给 docker-compose 时不起作用。也试过你的答案。 echo $DIR 给出了输出,但在 docker-compose 中没有
  • 如果你在 docker-compose 之后再添加一个回声,我想知道输出会是什么。
  • 另一种选择是使用 scp 将您的脚本发送到远程主机。然后,您可以使用 ssh 来执行它。如果脚本在顶部有 #!/bin/bash 可能会更好,以确保它被 bash 解释器处理。当然,变量扩展应该在将值发送到 docker-compose 之前发生,这就是为什么我要求您查看扩展是否在后续行中起作用,并在您确定 bash 正在执行它的地方运行脚本。我会用我的建议更新我的答案。
猜你喜欢
  • 2021-10-20
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 2021-01-03
  • 2020-11-07
相关资源
最近更新 更多