Docker命令删除除具有特定标签的容器及其图像之外的所有容器及其图像

时间:2017-05-12 21:25:34

标签: docker

例如,

如果我有几个带有x和y标签的容器

docker ps -a -q -f label = name = x

docker ps -a -q -f label = name = y

我想保留它们并从系统中删除所有剩余的容器及其图像。什么是docker命令???

2 个答案:

答案 0 :(得分:0)

我们使用 comm (1)来获取列出所有图像的第一个命令和按标签过滤的第二个命令之间的差异,并将所有这些信息传递给docker rmi / rm。 sed命令用于删除<none>未标记图像字符串或使用旧版本Docker构建的图像。

对于图片:

comm -3 <(docker images --digests --format '{{.Repository}}:{{.Tag}}@{{.Digest}}' | sort) <(docker images --digests --format '{{.Repository}}:{{.Tag}}@{{.Digest}}' -f label=FOO=BAR | sort) | sed -rne 's/([^>]):<none>@/\1@/p' | xargs -r docker rmi

对于容器:

comm -3 <(docker ps -a --format '{{.ID}}' | sort) <(docker ps -a --format '{{.ID}}' -f label=FOO=BAR | sort) | xargs -r docker rm

注意:请考虑是否将-v添加到上面的docker rm以删除相关的卷。

答案 1 :(得分:0)

有很多方法可以实现这一目标。这是一个简单的方法:

删除容器:

docker ps -a | grep -v 'java' | grep -v 'sql' | awk '{print $1}' | xargs docker rm

docker ps -a     => list all containers
grep -v 'java'   => anything that does not start with the name 'java'
grep -v 'sql'    => anything that does not start with the name 'sql'
...(add more here as required)
awk '{print $1}' => get the container id (i.e. first column from output)
xargs docker rm  => remove the matched containers 

要删除容器和相应的图像(只需停止容器并执行泊坞机强制删除图像)

docker ps -a | grep -v 'java' | grep -v 'sql' | awk '{print $1}' | xargs docker stop
docker ps -a | grep -v 'java' | grep -v 'sql' | awk '{print $2}' | xargs docker rmi -f