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


91

我想删除名称包含给定字符串(imagename)的所有版本的Docker映像。
我已经尝试了以下方法,但似乎不起作用:

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

Answers:


132

尝试以下方法:

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

Windows Powershell:

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

15
当前版本的Docker支持以下功能(无grep):docker rmi $(docker images'imagename')
Charlie

当前版本的Docker似乎支持此功能-也许我缺少了什么?-docker rmi'imagename'–
查理

8
@Charlie我想大多数人都在寻找一种方法来匹配所有与“ imagename ”匹配的图像,而不是一个单独命名为“ imagename”的图像。
RJFalconer

我收到以下错误消息:“ docker rmi至少需要1个参数。”
michali

@michali这表示没有返回匹配的图像。可以通过运行以下命令来验证是否存在匹配的条目:docker images |grep 'imagename'
Rambler

71

版本略精确-仅在存储库名称上进行grepping:

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

25
这只会删除标记为最新的图像docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
Drew

谢谢!这就是我想要的。
Hardhik

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

1
您能解释一下这是什么吗?少量的随机代码可能很危险。
千焦

6
docker images --format '{{.Repository}}:{{.Tag}}过滤输出,以便仅显示回购和标记(即foo:latest)。 grep 'imagename将这些行过滤为仅包含的图像imagename。将其放入会$()评估&传递到外部docker rmi,从而删除匹配的那些图像。
亚当·帕金

在上面的内容上进行扩展,您可以删除所有与确切图像名称相对应的标记图像,如下所示:docker rmi -f $(docker images --format '{{.Repository}}:{{.Tag}}' --filter=reference='imagename:*')'
timmins

1
在Windows上不存在“ grep”(cmd或powershell)在寡妇上可以使用以下工具docker rmi $( docker images --format '{{.Repository}}:{{.Tag}}' | Select-String -Pattern 'imagename')
Zameer Fouzan 18'Oct

20

docker images实际上使用第一个位置参数作为要过滤的图像名称。不需要grep和awk。该-q选项将仅返回可以提供给的匹配图像ID docker rmi

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

uniq需要删除重复,如果你有相同的图像标记不同。


这无疑是当今最好的选择。为了保持问题的一致性,尽管图像名称应该用引号引起来。
Colm Bhandal

8

只需--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是第一列,即Docker容器ID,而$ 3是第三列,即Docker映像ID


5

我发现我的答案更简单。

例如,您的图片名称为python_image

那么您的代码应为

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

我希望这有帮助。


我们可以基于通配符名称对多个图像执行此操作吗?
变量


3
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}'

3

对我来说工作(Docker版本19.03.5):

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

命令“ docker images'imagename'-q ”将列出单引号参数的所有图像id,因此将其与docker rmi(或docker rmi -f强制连接)将删除所有具有选定名称的图像


2

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

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

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



0

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

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

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/


可以,但是最好在docker rmi $(docker images -q --filter=reference="IMAGENAME:TAG")
docker

0

汇总此问题的解决方案以满足我的需要,以前没有发布过。

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

而且我不在乎是否未找到任何内容,或者命令是否抛出错误。如此添加|| true,最后将其添加到脚本中。

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

0

根据@Aditya的回答,您还可以创建一个bash函数来轻松删除图像。将此功能放到您的~/.profile。创建一个新的shell会话,或通过提供源source ~/.profile

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

用法:

drmi golang

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`
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.