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

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

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

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

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

我们使用comm (1)来获取列出所有图像的第一个命令和按标签过滤的第二个命令之间的差异,并将所有信息输出到docker rmi / rm。 sed命令用于删除未标记图像的<none>string,或者使用旧版Docker构build的图像。

对于图像:

 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以删除关联的卷。

有很多方法来完成这个。 这是一个简单的方法:

只要删除容器:

 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 (ie first column from output) xargs docker rm => remove the matched containers 

要删除容器和相应的图像(只需停止容器,并执行docker强制移除图像)

 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