多个docker筛选器选项是否执行本地AND或or操作



我正在尝试使用多个筛选器执行prune操作。这在这里的文档中有介绍:

筛选标志(--filter(的格式为"key=value"。如果有多个过滤器,则传递多个标志(例如,--filter"foo=bar"--filter"bif=baz"(

文档没有提到是否使用了像这样的多个过滤器,并使用逻辑ANDOR操作将它们组合在一起。

我希望它是一个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(。

最新更新