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)
基本上,它检查是否存在具有所提供名称的正在运行的容器,如果找到则停止它。然后,它会删除具有所提供名称的所有容器。
注意:您可能想要添加一些参数验证,就像不带参数使用一样,此脚本将停止所有正在运行的容器并删除所有已停止的容器。我没有在这里添加它是为了保持简单易读。
您必须考虑至少两种情况 - 删除已停止的容器(可以使用单个命令删除)和删除正在运行的容器(在删除容器之前必须先停止容器)。
除此之外,grep
我不会使用 来查找容器名称,而是使用 选项filter
,docker ps
这样您就不会因为命令选项与您在 grep 中放置的名称相匹配而最终 grep 出错误的容器。以下是我如何删除任何类似的 docker 容器,严格遵循以下顺序 -
for $(docker ps --filter="name=$name" -q) 中的container_id;do docker stop $container_id && docker rm $container_id;done
for $(docker ps --filter="name=$name" -q -a) 中的container_id;do docker rm $container_id;done
该-a
选项将包括所有容器,包括已停止的容器。不使用-a
默认选项,将仅包括正在运行的容器。因此,在第一步中,您删除正在运行的容器,然后在第二步中继续处理已停止的容器。要删除或停止容器,您只需要容器 ID,选项-q
仅输出 ID。