Jenkinsfile中使用$()与sh/bash执行docker kill时出现错误
Jenkinsfile中执行docker kill命令失败的解决方法
问题场景
我在Jenkinsfile中编写了如下Pipeline步骤:
steps { sh '''#!/bin/bash docker kill $(docker ps -q --filter ancestor=nginx-example )''' sh '''docker build -t nginx-example . docker run -d -p 8081:80 nginx-example''' }
执行时触发错误:
"docker kill" requires at least 1 argument. See 'docker kill --help'. Usage: docker kill [OPTIONS] CONTAINER [CONTAINER...] Kill one or more running containers [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline ERROR: script returned exit code 1 Finished: FAILURE
该命令在Jenkins Pipeline中可正常运行,但在Jenkinsfile中无法执行,需要解决如何在Jenkinsfile中正确使用$()执行docker kill的问题。
解决方法
核心问题是当没有匹配nginx-example的运行中容器时,docker ps -q --filter ancestor=nginx-example返回空值,直接传给docker kill就会触发参数缺失错误。以下是几种可行的解决方式:
方式1:先判断容器是否存在再执行kill
通过Shell条件判断,仅当容器ID非空时执行kill命令:
sh '''#!/bin/bash CONTAINER_ID=$(docker ps -q --filter ancestor=nginx-example) if [ ! -z "$CONTAINER_ID" ]; then docker kill "$CONTAINER_ID" fi'''
方式2:用xargs处理空输入
借助xargs -r的特性(标准输入为空时不执行后续命令),避免docker kill接收空参数:
sh '''#!/bin/bash docker ps -q --filter ancestor=nginx-example | xargs -r docker kill'''
方式3:改用docker rm -f简化命令
docker rm -f本身支持空输入场景(无匹配容器时不会报错),可以一步完成容器停止与删除:
sh '''docker rm -f $(docker ps -q --filter ancestor=nginx-example)'''
内容的提问来源于stack exchange,提问作者Rus Zzzeta
相关产品推荐
相关产品推荐

