docker ps -a 的 shell 脚本 | grep 查找正在运行的某些容器的数量

The*_*boy 6 shell bash shell-scripting docker

我想编写一个由我的开发构建服务器执行的脚本,该脚本将在构建和运行新容器之前删除任何“类似”的 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")
Run Code Online (Sandbox Code Playgroud)

小智 5

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

#!/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
Run Code Online (Sandbox Code Playgroud)

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

注意:您可能想要添加一些参数验证,就像不带参数使用一样,此脚本将停止所有正在运行的容器并删除所有已停止的容器。我没有在这里添加它是为了保持简单易读。


Dan*_* t. 3

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

除此之外,grep我不会使用 来查找容器名称,而是使用 选项filterdocker ps这样您就不会因为命令选项与您在 grep 中放置的名称相匹配而最终 grep 出错误的容器。以下是我如何删除任何类似的 docker 容器,严格遵循以下顺序 -

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

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