问题描述
首先:我已经搜索了该论坛,还浏览了文档,但仍然无法正确处理。
因此,我有一个要从bash脚本运行在远程服务器上的docker命令。我想将环境变量(在运行脚本的本地计算机上)传递到远程服务器。此外,我需要远程命令的响应。
这实际上是我要做的,也是我需要的:该脚本是我们Traefik / Docker / Elixir / Phoenix应用程序设置的一个小包装,可以轻松地连接到Erlang观察器中正在运行的Elixir应用程序。使用脚本,步骤将是:
- ssh进入远程计算机
-
docker ps
查看所有正在运行的容器,因为在我们的蓝色/绿色部署中,活动的一个更改名称 - 将docker exec放入正确的容器中
- 在docker容器内执行命令以连接到正在运行的Elixir应用程序
我现在使用的命令是:
CONTAINER=$(ssh -q $USER@$IP 'sudo docker ps --format "{{.Names}}" | grep ""$APP_NAME"" | head -n 1')
主要问题是grep和ENV var的零件。它是空的,不会被替换。这表明,因为var在远程计算机上不存在,所以在我的本地计算机上存在。我尝试使用单引号$()
,...或者它只是行不通,或者我在网上找到的解决方案都执行了该命令,但是后来我无法获取容器名称,我需要以下命令:
ssh -o 'RequestTTY force' $USER@$IP "sudo docker exec -i -t $CONTAINER /bin/bash -c './bin/app remote'"
感谢您的输入!
解决方法
首先,确定要致电sudo docker stop
吗?因为停止容器似乎并不是您提到的工作流程的一部分。 [edit:不再适用]
基本上,您使用双引号双引号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'"
,
您将需要使用
CONTAINER=$(ssh -q $USER@$IP <<< 'sudo docker ps --format "{{.Names}}" | grep "$APP_NAME" | head -n 1 | xargs -I{} sudo docker stop {}')