Многочисленные опции фильтра Docker выполняют локальную операцию И или ИЛИ? - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь выполнить операцию prune с несколькими фильтрами. Это описано в документах здесь :

Формат флага фильтрации (--filter) имеет значение «ключ = значение». Если существует более одного фильтра, тогда передайте несколько флагов (например, --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"

и файл Docker со следующими метками не будут удалены:

LABEL com.company.product="myproduct" com.company.project="proj2"

Возможно ли это?

1 Ответ

0 голосов
/ 31 октября 2018

Краткий ответ

Это AND.

Тестирование ...

3 Dockerfiles:

FROM alpine
LABEL apples="fruit"

FROM alpine
LABEL oranges="fruit"

FROM alpine
LABEL apples="fruit" oranges="fruit"

3 images:

$ 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...