Как лучше всего удалять оборванные изображения и связанные с ними контейнеры на основе метки изображения?

У меня есть пара оборванных изображений (изображения, которые появляются в docker images без тега). Чтобы очистить их, на основе LABEL, обычная команда: docker image prune -a --force --filter="label=some-key=some-value".

Однако эта команда не удаляет висячие изображения, связанные с контейнером. Независимо от того, запущен контейнер или остановлен.

Я не могу запустить docker container prune -f, так как не хочу удалять все остановленные контейнеры. Есть ли команда для удаления изображений и связанных с ними контейнеров на основе метки изображения?


person variable    schedule 14.05.2020    source источник
comment
Отвечает ли это на ваш вопрос? Docker удаляет ‹none› TAG изображения   -  person Kulshreshth K    schedule 14.05.2020
comment
Удалить только висящие изображения: docker rmi $(docker images --filter "dangling=true" -q --no-trunc)   -  person Kulshreshth K    schedule 14.05.2020
comment
Вы не можете применить rmi к оборванному изображению, которое используется контейнером.   -  person variable    schedule 14.05.2020
comment
Можете ли вы просто отфильтровать результаты из docker ps -aq и использовать их для удаления ненужных контейнеров? Как 2_?   -  person superstator    schedule 14.05.2020
comment
Фильтровать по? И это команда Linux, PowerShell или кроссплатформенная?   -  person variable    schedule 14.05.2020
comment
Что бы вы ни хотели, я предположил из вашего вопроса, что вы имели в виду какой-то фильтр. Бывший. docker ps -aq --filter="label=com.docker.compose.service=redis" дает мне все контейнеры, запущенные компоновкой для Redis, готовые к обрезке   -  person superstator    schedule 15.05.2020
comment
У моего контейнера нет метки- build" title="как использовать фильтр меток для промежуточных контейнеров, которые создаются во время сборки"> stackoverflow.com/questions/61794023/   -  person variable    schedule 15.05.2020


Ответы (1)


Учитывая изображение (или изображения) с меткой, вы хотите удалить все контейнеры, использующие это изображение.

Используя xargs и фильтр ancestor, вы можете сделать это:

docker image ls -q --filter "label=foo=bar" | \
    xargs -I IMG docker ps -aq --filter "ancestor=IMG" | \
    xargs docker rm -fv

Это не совсем «одна команда», но она должна привести вас туда, куда вам нужно.

Или PowerShell:

@(docker image ls -q --filter "label=foo=bar") | %{&"docker" ps -qa --filter "ancestor=$_"} | %{&"docker" rm -fv $_}
person superstator    schedule 15.05.2020