【问题标题】:How to kill a specific docker container in a single command如何在单个命令中杀死特定的 docker 容器
【发布时间】:2022-01-25 07:32:47
【问题描述】:

我已经在一个 groovy 脚本中设置了 jenkins 管道作业....

我正在尝试构建在远程服务器上运行 docker 命令的 jenkins 作业。 我的詹金斯预计会连接到远程服务器并执行

       docker run -d -p 60:80 <image name>
  

为此,我在 jenkins 管道作业中使用了以下 groovy 脚本

     stage ('Deploy on App Server')
     {
         def dockrun = 'docker run -d -p 60:80 <image name>'
         sshagent(['dev-servr-crdntls'])
         {
             sh "ssh -o StrictHostKeyChecking=no ubuntu@xx.xxx.xx.xx ${dockrun}" 
         }
     }

此脚本运行良好。 Jenkins 正在连接到远程服务器并运行 docker 命令,并且应用程序正在端口 60 上运行。

但是,由于这是在 CICD 的 jenkins 管道中,下次运行构建作业时会失败,因为端口 60 已经分配。 .

我想在运行 docker run -d -p ......命令之前关闭 60 端口。大家有什么建议

【问题讨论】:

  • 我能够在终端级别杀死在端口 60 上运行的特定容器,但这在 jenkins 管道中不起作用 $ docker rm -f docker ps | grep 60 | awk '{print $1}'
  • 我通常在终端里做docker stop [container name or id],你试过吗?
  • 嗨@NaphatAmundsen 谢谢你的回复。对于 docker stop 命令,我们必须在我无法执行的自动化脚本中传递容器 ID
  • 您可以使用docker run --name 选项为容器指定一个已知名称,并在docker stopdocker rm 命令(以及其他地方)中使用该名称,而无需查找容器ID。

标签: docker containers kill


【解决方案1】:

您可以使用以下命令杀死占用给定端口的正在运行的容器:

docker kill $(docker ps -qf expose=<port>)

解释: docker ps 命令允许列出容器并且有很多有用的选项。其中之一是 -f 标志,用于根据某些属性过滤容器。现在您可以使用-f expose=&lt;port&gt; 过滤占用&lt;port&gt; 的正在运行的容器。此外,-q 标志可用于仅输出容器 ID。此输出可用作docker kill 命令的输入。

编辑: 因为如果给定端口上没有运行容器,上述命令可能会失败并出现错误,因此可以使用以下命令来规避此问题:

docker kill $(docker ps -qf expose=<port>) 2> /dev/null || echo 'No container running on port <port>'

现在,如果占用&lt;port&gt;的容器存在并且正在运行,该命令将杀死该容器,或者输出No container running on port &lt;port&gt;(可选)

【讨论】:

  • 您好 bajro,谢谢您的回答。此命令给出错误 [ssh-agent] 已启动。 [管道] { [管道] sh + docker ps -qf expose=90 警告:加载配置文件时出错:/var/lib/jenkins/.docker/config.json:打开 /var/lib/jenkins/.docker/config。 json: 权限被拒绝 + ssh -o StrictHostKeyChecking=no ubuntu@xx.xxx.xx.xx sudo docker kill "docker kill" 至少需要 1 个参数。请参阅“docker kill --help”。用法:docker kill [OPTIONS] CONTAINER [CONTAINER...] 杀死一个或多个正在运行的容器 [Pipeline] } $ ssh-agent -k
  • @KiranSR docker kill 命令至少需要一个参数,即容器名称或 ID。 $(docker ps -qf expose=60) 部分返回占用机器上端口 60 的正在运行的容器的 ID。但是,如果当前没有容器占用端口 60,则该命令将像您的情况一样失败。话虽如此,该命令期望一个正在运行的容器占用给定端口(例如 60)
  • @KiranSR 查看我更新的答案,了解处理潜在错误的示例
  • docker kill $(docker ps -qf expose=) 2> /dev/null || echo 'No container running on port ' 这很好用.....非常感谢。现在我将在 Jenkins 管道中检查这一点
  • @KiranSR 很高兴我能提供帮助。请考虑将此答案标记为有帮助。这有助于将此问题和主题标记为已回答
猜你喜欢
  • 1970-01-01
  • 2015-03-01
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多