Фильтрация образов для удаления на основе меток (labels)
На этом последнем этапе мы рассмотрим еще один мощный вариант фильтрации для команды docker image prune
: фильтрацию на основе меток (labels). Метки - это пары ключ-значение, которые вы можете прикрепить к объектам Docker, включая образы, чтобы добавить метаданные. Затем вы можете использовать эти метки для фильтрации и управления ресурсами Docker.
Флаг --filter
с ключом label
позволяет вам указать, какие образы включать или исключать из процесса удаления на основе их меток.
Сначала создадим несколько образов с разными метками. Мы будем использовать простой Dockerfile и собрать два образа с разными метками.
Создайте файл с именем Dockerfile.labeled
в директории ~/project
со следующим содержимым:
FROM alpine:latest
LABEL environment="development"
LABEL version="1.0"
RUN echo "This is a labeled image" >/app/info.txt
Теперь соберите два образа из этого Dockerfile, применяя разные метки во время процесса сборки с помощью флага --label
.
docker build -t my-labeled-app:dev --label project=myapp --label stage=dev ~/project -f Dockerfile.labeled
docker build -t my-labeled-app:prod --label project=myapp --label stage=prod ~/project -f Dockerfile.labeled
Теперь мы собрали два образа, my-labeled-app:dev
и my-labeled-app:prod
, оба основанные на одном и том же Dockerfile, но с разными метками stage
.
Выведем список образов и проверим их метки.
docker images --filter reference="my-labeled-app*" --format "{{.Repository}}:{{.Tag}} {{.Labels}}"
Вы должны увидеть вывод, показывающий образы и их связанные метки.
Теперь используем команду docker image prune
для удаления образов на основе их меток. Предположим, что мы хотим удалить все неиспользуемые образы, которые имеют метку stage=dev
. Мы можем использовать флаг --filter
с label=stage=dev
. Также мы будем использовать флаг -a
, чтобы рассмотреть все неиспользуемые образы, а не только "висящие".
docker image prune -a --filter "label=stage=dev"
Docker покажет вам образы, которые соответствуют фильтру и будут удалены. Подтвердите, введя y
.
После удаления образов выведем список образов снова:
docker images --filter reference="my-labeled-app*" --format "{{.Repository}}:{{.Tag}} {{.Labels}}"
Вы должны увидеть, что образ my-labeled-app:dev
был удален, в то время как my-labeled-app:prod
остался, так как он не соответствовал фильтру.
Вы также можете использовать синтаксис label!=key=value
для удаления образов, которые не имеют определенной метки или значения метки. Например, чтобы удалить все неиспользуемые образы, которые не имеют метку stage=prod
:
docker image prune -a --filter "label!=stage=prod"
Эта команда удалит my-labeled-app:dev
(если он все еще существовал) и любые другие неиспользуемые образы, которые не имеют метки stage=prod
.
Фильтрация по меткам предоставляет гибкий способ управления и очистки ваших образов на основе ваших собственных определенных метаданных.