我正在尝试使用多个筛选器执行prune
操作。这在这里的文档中有介绍:
筛选标志(--filter(的格式为"key=value"。如果有多个过滤器,则传递多个标志(例如,--filter"foo=bar"--filter"bif=baz"(
文档没有提到是否使用了像这样的多个过滤器,并使用逻辑AND
或OR
操作将它们组合在一起。
我希望它是一个AND
操作,这样我就可以做这样的事情:
docker image prune --all --force --filter="label=com.company.product=myproduct"
--filter="label!=com.company.project=proj2"
并且具有以下标签的Dockerfile不会被修剪:
LABEL com.company.product="myproduct" com.company.project="proj2"
这可能吗?
简短回答
这是AND
。
正在测试
3Dockerfiles
:
FROM alpine
LABEL apples="fruit"
FROM alpine
LABEL oranges="fruit"
FROM alpine
LABEL apples="fruit" oranges="fruit"
3images
:
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
both latest e9e48f31222f 11 seconds ago 4.41MB
oranges latest f384e4db9974 33 seconds ago 4.41MB
apples latest 06fa8c565ec1 51 seconds ago 4.41MB
--filter
测试遵循*:
$ docker image ls --filter label=apples=fruit
REPOSITORY TAG IMAGE ID CREATED SIZE
both latest e9e48f31222f 34 seconds ago 4.41MB
apples latest 06fa8c565ec1 About a minute ago 4.41MB
$ docker image ls --filter label=oranges=fruit
REPOSITORY TAG IMAGE ID CREATED SIZE
both latest e9e48f31222f 44 seconds ago 4.41MB
oranges latest f384e4db9974 About a minute ago 4.41MB
$ docker image ls --filter label=apples=fruit --filter label=oranges=fruit
REPOSITORY TAG IMAGE ID CREATED SIZE
both latest e9e48f31222f About a minute ago 4.41MB
修剪
名为both
的图像(同时具有两个标签(被删除:
$ docker image prune -a --filter label=apples=fruit --filter label=oranges=fruit
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: both:latest
deleted: sha256:e9e48f31222f04dd54cffb4688367338d8e061ef3b1471768c1ef6a7045007ab
*注意:docker image ls
不适用于阴性过滤(!=
(,来自文档:
预测将删除的内容
如果使用正过滤(测试标签的存在或标签是否具有特定值(,则可以使用具有相同过滤语法的
docker image ls
来查看哪些图像与您的过滤器匹配。但是,如果您使用负过滤(测试是否缺少标签或标签是否不具有特定值(,则这种类型的过滤器不适用于
docker image ls
,因此您无法轻松预测将删除哪些图像。此外,docker image prune
的确认提示始终警告所有悬挂图像都将被删除,即使您使用的是--filter
。
tgogo的答案非常准确,因为当使用多个否定的标签过滤器时,这些过滤器反而被"或"运算在一起。这是未记录的,我认为它不应该以这种方式工作,所以我已经提交了一个关于这个问题的问题,但对于那些现在想要这个功能的人来说:
bash -c '{ docker ps -aq --filter "status=exited" && docker ps -aq --filter "label=foo" && docker ps -aq --filter "label=bar"; }' | sort | uniq -u | xargs --no-run-if-empty docker rm
在命令中添加或删除&& docker ps -aq --filter "label=<label exclude from pruning>"
以添加或删除否定的标签过滤器。其他非否定滤波器应添加到docker ps
的第一个实例(例如docker ps -aq --filter "status=exited" --filter "until=24h"
(。bash -c
仅适用于不支持上面使用的bash特定语法的shell用户(如fish(。