如何根据名称删除docker镜像?

时间:2016-10-17 10:30:55

标签: docker

我想删除名称包含给定字符串(imagename)的所有版本的docker图像。
我已经尝试了下面的内容,但它似乎不起作用:

docker images | grep 'imagename' | xargs -I {} docker rmi

18 个答案:

答案 0 :(得分:60)

尝试以下方法:

docker rmi $(docker images |grep 'imagename')

Windows Powershell:

docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}"|findstr "imagename")

答案 1 :(得分:37)

稍微更精确的版本 - 仅对存储库名称进行grepping:

docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')

答案 2 :(得分:23)

docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')

答案 3 :(得分:7)

docker images实际上使用第一个位置参数作为图像名称进行过滤。不需要grep&awk和awk。 -q选项只会返回匹配的图片ID,这些ID可以输入docker rmi

docker rmi --force $(docker images -q imagename | uniq)

如果您标记的图片方式不同,则需要uniq才能删除重复项。

答案 4 :(得分:6)

只需在命令末尾添加--force即可。像:

sudo docker rmi <docker_image_id> --force

要使其更加智能,您可以在删除图片之前停止任何正在运行的容器:

sudo docker stop $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rm $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rmi $(docker images | grep <your_image_name> | awk '{print $3}') --force

docker ps中, $ 1 是第1列,即泊坞窗容器ID $ 3 是第3列,即泊坞窗图片ID

答案 5 :(得分:3)

为我工作( Docker版本19.03.5 ):

docker rmi $(docker images 'imagename' -q)

命令“ docker images'imagename'-q ”将列出单个引用参数的所有图像ID,以便将其与 docker rmi (或 docker rmi -f (强制)),它将删除所有具有选定名称的图像

答案 6 :(得分:2)

我还得到了另一个简明的答案。唯一的变化是删除不必要的-I {}标志。

docker images | grep 'imagename' | xargs docker rmi

答案 7 :(得分:2)

docker rmi `docker images | awk '$1 ~ /imageName/ {print $3}'`

这将删除名称为“imageName”的所有图像。 在某些情况下,这可能会产生错误,例如“图像在一个或多个存储库中被引用”。在那种情况下使用强制删除。

docker rmi -f `docker images | awk '$1 ~ /imageName/ {print $3}'`

另一种方式可以是:

docker images | awk '{ OFS = ":" }$1 ~ /imageName/ {print $1,$2}'

答案 8 :(得分:2)

出于某种原因,我无法在这里使用任何给定的答案。这对我有用。

docker images | grep \"gcr.io/kubernetes-learn-197422/last-week-weather-service\" | awk '{print $3}' | xargs docker rmi

awk '{print $3}'是一个重要的部分。它从第3列中提取id。

答案 9 :(得分:1)

我觉得我的答案更简单。

例如,您的图片名称为python_image

然后您的代码

docker rmi $(docker images --filter=reference='python_image' --format "{{.ID}}")

我希望这会有所帮助。

答案 10 :(得分:1)

docker rmi $(docker image ls repo/image_name* | awk {'print $1":"$2'} )

答案 11 :(得分:0)

尝试一下:

docker images | grep 'DOCKER_IMAGE_NAME' | xargs -l bash -c 'docker rmi $0:$1' | xargs

答案 12 :(得分:0)

基于我的preferred answer,但有一个变量:

docker rmi --force "$(docker images -q $repository | uniq)"

这可以在Jenkins管道中使用:

sh(script: 'docker rmi --force "$(docker images -q $repository | uniq)"', returnStdout: true)

我更喜欢这个选项,而不是通过标签删除:

$ docker rmi test:latest

这是因为,正如docs say和我所验证的那样,”使用带有标签作为参数的此命令只会删除标签。如果标签是图像的唯一标签,则两个图像并删除标签。”

答案 13 :(得分:0)

信息性:

docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}" |grep imagename |grep none)

给出此错误:

守护程序的错误响应:无效的引用格式

可能是因为我的图像看起来像这样:

hostname:5000/imagename:<none>

我必须使用图像ID并执行以下命令:

docker rmi `docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}" |grep imagename |grep none |cut -d ' ' -f2`

要删除已退出的容器,请执行以下操作:

docker container rm `docker container ls -a --format "{{.ID}} {{.Image}} {{.Status}}" |grep Exited |grep imagename|cut -d ' ' -f1`

答案 14 :(得分:0)

基于@Aditya的答案,您还可以创建一个bash函数来轻松删除图像。将此函数放入您的~/.profile。创建新的Shell会话或通过source ~/.profile来获取它。

function drmi() {
    docker images | grep $1 |  xargs docker rmi
}

用法:

drmi golang

答案 15 :(得分:0)

将这个问题的解决方案组合在一起以满足我的需求,这是以前没有发布的。

我想匹配本地构建的图像:library/myapp,我已经对其进行了重命名,标记并推送到私有仓库:myrepo.org/library/myapp。将其推送后,我要清理本地docker reg。

我不在乎是否找不到任何内容或命令是否抛出错误。因此,在末尾添加了|| true以便将其包含在脚本中。

docker rmi $(docker image ls */library/myApp --format '{{.Repository}}:{{.Tag}}') || true

答案 16 :(得分:0)

docker rmi $(docker images --filter=reference="IMAGENAME:TAG")

例如,如果我有以下图像

REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
abcdefg/hij                   7.0.0-beta-4.0      3128835950cd        7 days ago          51.4MB
abcdefg/hij-action            7.0.0-beta-4.0      42a7255beb74        7 days ago          97.4MB
abcdefg/hij-test              7.0.0-beta-4.0      17246aed35d0        7 days ago          97.4MB
abcdefg/hij-server            7.0.0-beta-4.0      42c45e561f2c        7 days ago          335MB
abcdefg/hij-init              7.0.0-beta-3.0      f648bb622933        7 days ago          55.2MB
abcdefg/hij-dir               7.0.0-beta-3.0      0db07d3aaccf        7 days ago          97.4MB
abcdefg/hij-mount             7.0.0-beta-3.0      18d1c0e1502c        4 weeks ago         33.7MB

然后docker rmi $(docker images --filter=reference="abcd*:*4.0")将删除前四个图像。

更多信息,请参见https://docs.docker.com/engine/reference/commandline/images/

答案 17 :(得分:0)

次要备注: 根据我们的经验,自docker 18.03起,您似乎不再能够仅根据名称删除未加标签的图像。您需要使用如上所述的名称+标签或使用ID。

docker images --format={{.ID}} | xargs -I % sh -c 'docker rmi --force % 2>&1'