如何在Jenkins中运行docker rmi $(docker images -a -q)作为ssh脚本的一部分

我正在构build一个Jenkins作业来构buildAWS EC2实例上的docker容器,这是一个给出错误的Jenkins脚本的示例:

#!/bin/bash -e # Not giving the IP here but I guess you can understand HOST = Some IP address of EC2 instance in AWS # Current Project workspace # Download source code and create a tar and then SCP it in to AWS EC2 # So my Code is copied in to AWS EC2 instance now ... # Now do the SSH and run the script on AWS EC2 instance ssh -o StrictHostKeyChecking=no -i MySecrets.pem ec2-user@$HOST \ "tar xvf pc.tar && \ cd my_project_source_code && \ docker stop $(docker ps -a -q) && \ docker rmi $(docker images -a -q) && \ sh -c 'nohup docker-compose kill > /dev/null 2>&1 &' && \ docker-compose build --no-cache && \ sh -c 'nohup docker-compose up > /dev/null 2>&1 &' " 

当我在Jenkins中构build这个工作时,它在输出控制台上出现以下错误:

“docker stop”至less需要1个参数。 请参阅“docker停止 – 帮助”。

用法:docker停止[选项]集装箱[集装箱…]

停止一个或多个正在运行的容器构build步骤'Execute shell'标记为失败

所以我的问题是我的bash脚本在这里有什么问题?

在另一个注意:

我可以运行docker stop $(docker ps -a -q),当我通过CLIlogin到EC2时。 但是,当相同的命令在Jenkins作业bash shell脚本中运行时,它不会将其识别为有效的脚本。 我在这里做错了什么? 这似乎是从我身边的一些误解,如何在Jenkins Job的bash shell脚本中运行这个命令,但我不完全确定。

如果你想让脚本中的replace在远程端运行,它需要在本地shell不会尝试首先评估的情况下传递给ssh 。 双引号不是那个上下文。

引用的heredoc将符合这个法案:

 ssh -o StrictHostKeyChecking=no -i MySecrets.pem "ec2-user@$HOST" 'bash -s' <<'EOF' tar xvf pc.tar || exit cd my_project_source_code || exit docker stop $(docker ps -a -q) || exit docker rmi $(docker images -a -q) || exit sh -c 'nohup docker-compose kill > /dev/null 2>&1 &' || exit docker-compose build --no-cache || exit sh -c 'nohup docker-compose up > /dev/null 2>&1 &' || exit EOF