docker ps -a | grep 的 Shell 脚本用于查找正在运行的特定容器数量

docker ps -a | grep 的 Shell 脚本用于查找正在运行的特定容器数量

我想编写一个由我的开发构建服务器执行的脚本,该脚本将在构建和运行新容器之前删除任何“类似”的docker容器。

下面是我需要的 bash 脚本的伪代码

var name = $1
var number_of_results = # of containers returned from $(docker ps -a | grep "$name")

if(number_of_result > 0)
      docker rm -f $(docker ps -a | grep "$name")

答案1

以下脚本应该可以执行您想要的操作:

#!/bin/bash

name=$1

matchingStarted=$(docker ps --filter="name=$name" -q | xargs)
[[ -n $matchingStarted ]] && docker stop $matchingStarted

matching=$(docker ps -a --filter="name=$name" -q | xargs)
[[ -n $matching ]] && docker rm $matching

基本上,它会检查是否有一个具有所提供名称的正在运行的容器,如果找到,则停止它。然后,它会删除具有所提供名称的任何容器。

笔记:您可能需要添加一些参数验证,因为如果不使用参数,此脚本将停止所有正在运行的容器并删除所有已停止的容器。我没有在这里添加它以使其保持简单易读。

答案2

您至少需要考虑两种情况 - 删除已停止的容器(可以使用单个命令删除)和删除正在运行的容器(其中必须先停止容器才能删除)。

除此之外,grep我不会使用 来查找容器名称,而是使用 选项filterdocker ps这样你就不会因为命令选项与你在 grep 中输入的名称匹配而 grep 错误的容器。下面是我删除任何类似的 docker 容器的方法,严格按照以下顺序操作 -

  1. 删除正在运行的容器
对于 $(docker ps --filter="name=$name" -q) 中的容器 ID;执行 docker stop $容器 ID && docker rm $容器 ID;完成
  1. 删除已停止的容器,因为我们已在步骤 1 中停止了正在运行的容器。
对于 $(docker ps --filter="name=$name" -q -a) 中的 container_id;do docker rm $container_id;done

-a选项将包括所有容器,包括已停止的容器。不使用-a默认选项,将仅包括正在运行的容器。因此,在第一步中,您删除正在运行的容器,然后在第二步中继续处理已停止的容器。要删除或停止容器,您只需要容器 ID,选项-q仅输出 ID。

相关内容