我想在Jenkins管道中运行嵌套的shell命令,例如:
docker stop $(docker ps -aq)
不幸的是,当我将其格式化为管道语法时:
sh('docker stop $(docker ps -aq)')
Jenkins似乎没有正确运行它们,但输出如下:"docker stop" requires at least 1 argument(s).
我试着在bash下运行命令,如下所示:Run bash command on jenkins pipeline但最终会出现类似的问题。有什么解决办法吗?
5条答案
按热度按时间e5njpo681#
如果您将shell命令扩展为两行,则Jenkins Pipeline会更容易:
我们使用第一行将shell命令的输出捕获到变量中:
containers = sh(returnStdout: true, script: 'sudo /usr/bin/docker ps -aq')
然后,我们使用第二个命令对存储在变量中的第一个命令的捕获输出进行操作:
sh("sudo /usr/bin/docker stop $containers")
请注意,
docker
命令通常可以使用docker ps -aq
的输出来操作其其他命令,但如果它不喜欢存储在变量中的输出,则可以像下面这样重新格式化它:containers = sh(returnStdout: true, script: 'sudo /usr/bin/docker ps -aq').trim()
例如,这将去掉前导空格和尾随换行符。Docker CLI通常不关心这一点,但在这里可能需要进行一些重新格式化。
由于删除这里的换行符会导致一个很长的组合容器ID,因此我们需要(如您所述)用空格替换它来分隔容器ID。这将使存储在
containers
变量中的字符串的格式:containers = sh(returnStdout: true, script: 'sudo /usr/bin/docker ps -aq').replaceAll("\n", " ")
oyxsuwqo2#
我还没有这样使用过docker stop命令,但语法与docker rm命令相同。流水线代码块+ OP的行,例如:
jucafojl3#
加上@Matt的回答
你需要一张空箱支票。如果没有容器可供停止,Jenkins构建将失败并抛出以下错误消息
"docker stop" requires at least 1 argument(s).
要处理这个问题,您只需要检查容器的可用性。下面是完整的代码
qrjkbowd4#
你有没有试过像这样的:
?
7uzetpgm5#
这在我的centos linux代理上很有效
注意:
docker rm -f
删除所有容器,即使它正在运行