Linux Bash脚本SSH命令变量插值

Linux Bash脚本SSH命令变量插值,linux,bash,docker,ssh,Linux,Bash,Docker,Ssh,第一:我已经搜索了论坛,也浏览了文档,但仍然无法正确获取 因此,我有一个docker命令,我想从我的bash脚本在远程服务器上运行。我想将一个环境变量(在运行脚本的本地计算机上)传递给远程服务器。此外,我需要远程命令的响应 以下是我实际上正在尝试做的和我需要的:脚本是我们Traefik/Docker/Elixir/Phoenix应用程序设置的一个小包装器,能够轻松连接到Erlang observer内部正在运行的Elixir应用程序。使用脚本,步骤如下: ssh连接到远程机器 docker p

第一:我已经搜索了论坛,也浏览了文档,但仍然无法正确获取

因此,我有一个docker命令,我想从我的bash脚本在远程服务器上运行。我想将一个环境变量(在运行脚本的本地计算机上)传递给远程服务器。此外,我需要远程命令的响应

以下是我实际上正在尝试做的和我需要的:脚本是我们Traefik/Docker/Elixir/Phoenix应用程序设置的一个小包装器,能够轻松连接到Erlang observer内部正在运行的Elixir应用程序。使用脚本,步骤如下:

  • ssh连接到远程机器
  • docker ps
    查看所有正在运行的容器,因为在我们的蓝色/绿色部署中,活动容器更改了名称
  • 将docker exec放入正确的容器中
  • 在docker容器内执行命令,以连接到正在运行的Elixir应用程序
我现在使用的命令是:

CONTAINER=$(ssh-q$USER@$IP'sudo docker ps--format“{{.Names}}”| grep“$APP_NAME”“| head-n1”)
主要问题是grep和环境变量的部分。。。它是空的,不会被替换。这很有意义,因为var不存在于远程机器上,它存在于我的本地机器上。我尝试了单引号,
$()
。。。要么它不起作用,要么我在网上找到的解决方案执行该命令,但我无法获取容器名称,我需要该名称来执行后续命令:

ssh-o'RequestTTY force'$USER@$IP“sudo docker exec-i-t$CONTAINER/bin/bash-c./bin/app remote”

谢谢你的意见

您需要使用将带有本地环境变量(APP_NAME)的命令重定向到ssh命令中。您需要使用将带有本地环境变量(APP_NAME)的命令重定向到ssh命令中。首先,您确定需要调用
sudo docker stop
?因为停止容器似乎不是您提到的工作流程的一部分。[编辑:不再适用]

基本上,您使用了双引号,
grep“$APP_NAME”
,但似乎这个变量没有被替换(因为整个命令
“sudo docker ps…”
都是单引号);根据您的问题,此变量在本地可用,但在远程计算机上不可用,因此您可以尝试编写:

CONTAINER=$(ssh -q $USER@$IP 'f() { sudo docker ps --format "{{.Names}}" | grep "$1" | head -n 1; }; f "'"$APP_NAME"'"')
首先,您确定需要呼叫sudo docker stop?因为停止容器似乎不是您提到的工作流程的一部分。[编辑:不再适用]

基本上,您使用了双引号,
grep“$APP_NAME”
,但似乎这个变量没有被替换(因为整个命令
“sudo docker ps…”
都是单引号);根据您的问题,此变量在本地可用,但在远程计算机上不可用,因此您可以尝试编写:

CONTAINER=$(ssh -q $USER@$IP 'f() { sudo docker ps --format "{{.Names}}" | grep "$1" | head -n 1; }; f "'"$APP_NAME"'"')

您可以尝试以下单个命令:

ssh -t $USER@$IP "docker exec -it \$(docker ps -a -q --filter Name=/$APP_NAME) bash -c './bin/app remote'"

您可以尝试以下单个命令:

ssh -t $USER@$IP "docker exec -it \$(docker ps -a -q --filter Name=/$APP_NAME) bash -c './bin/app remote'"

对其进行重组以避免docker exec将避免一层引用;在
docker exec
命令中避免使用
sh-c
。你想让它只是容器的默认命令,这样你就可以
docker运行你的图像
,而不需要在之后执行手动步骤吗?嗯,我喜欢你的建议,但是docker容器已经有了一个默认命令,可以在启动web应用时启动,您可以在docker文件中添加不同的命令吗?重新构造此命令以避免
docker exec
将避免引用层;在
docker exec
命令中避免使用
sh-c
。你想让它成为容器的默认命令,这样你就可以
docker运行你的图像
,而不必在之后执行手动步骤吗?嗯,我喜欢你的建议,但是docker容器已经有了一个默认命令,可以在启动web应用程序时在docker文件中添加其他命令吗?关于停止,你是对的,我更新了我原来的问题,这是一个复制/粘贴错误,当然应该在
head-n1
之后停止。@JeroenBourgois OK!我也更新了我的帖子。你测试过我建议的命令了吗?关于停止的问题你是对的,我更新了我原来的问题,这是一个复制/粘贴错误,当然应该在
头-n1
之后停止。@JeroenBourgois OK!我也更新了我的帖子。你测试过我建议的命令了吗?