我想直接用ssh连接到远程运行的Docker容器。通常我可以
$ ssh -i privateKey user@host
$ docker ps #which will list all running containers
$ docker exec -it ***** bash deploy.sh # ***** is container id and this line run a deployment script
但我需要从Jenkins管道运行这个脚本,我只有一次机会。经过多次尝试,我想出了这个
$ ssh -tt -i ~/privateKey user@host docker exec -it $(docker ps | grep unique_text | cut -c1-10) /bin/bash deploy.sh
这对我的困境没有帮助,因为它会回归
"docker exec" requires at least 2 arguments.
这实际上意味着命令被截断在这里$(docker ps | grep ...
我的解决方案
sh 'ssh -tt -i $FILE -o StrictHostKeyChecking=no $USER@$HOST /bin/bash -c \'"docker exec -it $(docker ps | grep unique_text | cut -c1-10) bash start.sh"\''
$ ssh -tt -i ~/privateKey user@host docker exec -it $(docker ps | grep unique_text | cut -c1-10) /bin/bash deploy.sh
这将使用本地计算机上的docker ps
命令运行子shell,而不是远程计算机。您将要在远程服务器上的shell中处理该完整命令:
$ ssh -tt -i ~/privateKey user@host /bin/sh -c "docker exec -it $(docker ps | grep unique_text | cut -c1-10) /bin/bash deploy.sh"
解决此问题的最佳方法是在Jenkins中创建一个节点
步骤1 - 转到Manage Jenkins部分并向下滚动到Manage Nodes部分。
步骤3 - 为节点命名,选择Dumb slave选项,然后单击Ok。
步骤4 - 输入节点从机的详细信息。在下面的例子中,我们正在考虑将奴隶机器作为Windows机器,因此选择“让Jenkins控制这个Windows奴隶作为Windows服务”作为启动方法。我们还需要添加从节点的必要详细信息,例如节点名称和节点机器的登录凭据。单击“保存”按钮。输入名称为“New_Slave”的标签可用于配置作业以使用此从属机器。
完成上述步骤后,新节点机器将最初处于脱机状态,但如果正确输入了上一屏幕中的所有设置,则将联机。如果需要,可以随时使节点从机关闭。
在我的Jenkins管道中
node("build_slave"){
sh 'docker exec -it $(docker ps | grep unique_text | cut -c1-10) bash deploy.sh'
}