Что такое свисающее изображение и что такое неиспользуемое изображение?

157

В докерской документации docker image prune можно использовать флаг -a для

Удалите все неиспользуемые изображения, а не только свисающие

и позже

Удалите все висящие изображения. Если указан параметр -a, также будут удалены все изображения, на которые не ссылается ни один контейнер.

Может ли кто-нибудь объяснить мне, что такое висячие изображения и в чем разница между висящими и неиспользуемыми изображениями?

гермафродит
источник
Докер изображение чернослив (без -a) делает то же самое , хотя
гермафродит
Если вы используете это в jenkins, произойдет сбой, мы потеряем резервную копию докера в производственной среде, если будем зависеть от кэша образа докера. pruneне рекомендуется в производстве /
Джинна Балу

Ответы:

156

Неиспользуемое изображение означает, что оно не было назначено или использовано в контейнере. Например, при запуске docker ps -a- в нем будут перечислены все ваши вышедшие и запущенные в данный момент контейнеры. Любые изображения, показанные как используемые в любом из контейнеров, являются «использованным изображением».

С другой стороны, висящее изображение просто означает, что вы создали новую сборку изображения, но ему не дали новое имя. Таким образом, старые образы, которые у вас есть, становятся «висячим образом». Это старые изображения, которые не имеют тегов и отображают " <none>" на своем имени при запуске docker images.

При запуске docker system prune -aон удалит неиспользуемые и свисающие изображения. Поэтому любые изображения, используемые в контейнере, вне зависимости от того, были ли они завершены или запущены в данный момент, НЕ будут затронуты.

Серей
источник
Согласно документации при запуске docker prune без -a удаляются только висячие изображения. -а будет гарантировать, что неиспользуемые изображения также будут удалены правильно? docs.docker.com/engine/reference/commandline/system_prune
гермафродит
1
Очень интересно. Таким образом, висящее изображение может использоваться контейнером. Примечание: Docker предупреждает вас, если существуют какие-либо контейнеры, которые используют эти непомеченные изображения.
гермафродит
7
docker system prune --all --filter "until=24h"сохраняет последние изображения также
Гарри Морено
1
Согласно docs.docker.com/engine/reference/commandline/system_prune/… также docker system prune -a удаляет остановленные контейнеры. Таким образом, он должен удалять изображения, связанные только с вышедшими контейнерами, верно?
LFK
41

Самый безопасный и простой способ очистки свисающих изображений

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

Изображения Docker состоят из нескольких слоев. Висячие изображения - это слои, которые не имеют отношения к помеченным изображениям. Они больше не служат цели и занимают место на диске.

Примечание: я рекомендую не использовать pruneв производстве, потому что docker system prune -aбудут удалены все изображения, на которые не ссылается контейнер, по которым мы не можем откатиться до предыдущего выпуска.

Для отображения висячих изображений, добавив флаг фильтра -fсо значением dangling=trueв docker images.

Список оборванных изображений

docker images -f dangling=true

Удалить оборванные изображения

docker rmi $(docker images -f dangling=true -q)

ИЛИ

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

Когда мы запускаем какие-либо задания cron для удаления висящих вещей, используйте вышеописанное, чтобы убедиться, что задание выполняется успешно. Как и в Дженкинсе, если мы запустим работу в свободном стиле с запятой, запятая, работа никогда не выйдет из строя, даже если в машине не будет болтаться.

Это самый безопасный и простой способ очистки свисающих изображений и возврата нашего дискового пространства для использования.

Джинна Балу
источник
2
как насчет черновика изображения в докере? Документы говорят: «Удалите все висящие изображения. Если указан параметр -a, будут также удалены все изображения, на которые не ссылается ни один контейнер». docs.docker.com/engine/reference/commandline/image_prune/...
гермафродит
2
@herm, в нижней части страницы, на которую вы ссылались «Примечание: вам будет предложено подтвердить, прежде чем чернослив удалит что-либо, но у вас нет списка того, что может быть удалено». Я думаю, смысл этого ответа в том, что вы можете получить список висячих изображений, который вы затем явно указываете для удаления, в отличие от слепого удаления всех висячих изображений с помощью чернослива.
bzier
Изображения, имеющие имя и метку, как ни один из docker images, висят. Как проверить их размер? Кроме того, изображения с именами и тегами, как нет, docker images -aявляются промежуточными изображениями. Можно ли их удалить и как проверить их размер?
переменная
17

На изображения в докере ссылается дайджест sha256, часто называемый идентификатором изображения. Этот дайджест - все, что вам нужно для того, чтобы образ существовал на хосте докера. Как правило, в моей системе у вас есть теги, которые указывают на эти дайджесты, например, тег busybox: последние текущие точки указывают на идентификатор изображения c30178c523 .... Несколько тегов могут указывать на одно и то же изображение, и любой тег может быть изменен, чтобы указывать на другой идентификатор, например, когда вы извлекаете новую копию busybox: последней или создаете новую версию образа вашего приложения.

Висячие изображения - это изображения, которые не имеют тега и не имеют дочернего изображения (например, старого изображения, в котором использовалась другая версия FROM busybox:latest), указывая на них. Возможно, раньше у них был тег, указывающий на них, а затем этот тег изменился. Или они могли никогда не иметь тега (например, вывод docker buildбез включения опции тега). Их, как правило, безопасно удалить, если не запущены контейнеры, ссылающиеся на старый идентификатор изображения. Основная причина держать их в кеше для целей сборки.

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

BMitch
источник
Пока выполняется сборка Docker (процесс, в котором создаются слои и возможные кандидаты в будущие висячие изображения), в новом окне, если я запускаю удаление образа Docker, это как-то повлияет на выполняемую сборку?
переменная
@variable там может быть состояние гонки, но обычно работающий контейнер для этапа сборки приводит к тому, что изображение идентифицируется как используемое. Худшее, что может случиться, - это либо ошибка удаления, либо сборка, и вам придется ее повторно запускать. Я хотел бы выяснить, можете ли вы ограничить удаление, чтобы избежать изображений, которые вы в настоящее время используете для создания, поскольку успешное удаление приведет к тому, что в будущих сборках потребуется повторная загрузка изображений.
BMitch
Промежуточные изображения (те, у которых нет имени / тега, отображаемого при запуске docker images -a) также называются «висячие» изображения? Они очищены с черносливом изображения докера?
переменная
У меня их больше нет в моей среде (здесь используется buildkit), поэтому я бы порекомендовал попробовать себя в лабораторной среде, чтобы посмотреть, что произойдет.
BMitch
Тем не менее, удаление непомеченных «изображений» из промежуточных этапов довольно бессмысленно, если только вы не удалите окончательное помеченное изображение, все слои повторно используются в более позднем изображении и не могут быть удалены. Если вы удаляете их, вы уничтожаете кеш сборки и заставляете все будущие образы занимать больше времени для сборки и дискового пространства для хранения.
BMitch
5

Висячие изображения - это слои, которые не имеют отношения к помеченным изображениям. Они больше не служат цели и занимают место на диске.

Неиспользуемое изображение - это изображение, которое не было назначено или использовано в контейнере.

Список оборванных изображений

docker images -f dangling=true
subh2273
источник
3

висячие изображения являются непомеченными изображениями. Следующая команда дает список висячих изображений.

docker images --filter "dangling=true"

docker image prune удаляет все висящие изображения.

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

docker image prune -a удалить все висячие, а также неиспользуемые изображения.

Как правило, вы не хотите удалять все неиспользуемые изображения до некоторого времени. Следовательно, лучше удалить с помощью фильтра.

docker image prune -f --filter "until=6h"

Венкат Котра
источник
1) docker image prune -a -f --filter "until=6h"также удаляет висячие изображения?
переменная
2) В вашей последней команде вы упомянули docker image prune -f --filter "until=6h"- поскольку нет -a - тогда как получится удалить неиспользуемые изображения?
переменная
0

Я видел полезные команды (псевдонимы) для удаления висячих изображений, любезно предоставленные Andyneff здесь: https://forums.docker.com/t/how-to-delete-cache/5753 :

alias docker_clean_images='docker rmi $(docker images -a --filter=dangling=true -q)' 
alias docker_clean_ps='docker rm $(docker ps --filter=status=exited --filter=status=created -q)' 

Первый очищает все висящие изображения. Это полезно для удаления промежуточных изображений, оставшихся от нескольких сборок. Второй - для удаления остановленных контейнеров. Это псевдонимы, которые я использую для текущего обслуживания

Если вы хотите удалить ВСЕ свой кеш, сначала убедитесь, что все контейнеры остановлены и удалены, поскольку вы не можете удалить изображение, используемое контейнером. Так что-то похожее

docker kill $(docker ps -q) docker_clean_ps docker rmi $(docker images
-a -q)

Это убило бы и удалило все изображения в вашем кэше.

Алексей Мартианов
источник
0

На скриншоте с изображениями «ни одного» имени нет висящих изображений. Повисшее изображение означает, что вы создали новую сборку изображения, но ему не дали новое имя. Таким образом, старые образы, которые у вас есть, становятся «висячим образом». Это старые изображения, которые не имеют тегов и отображают "" в своем имени при запуске образов докера.

docker system prune -a, он удалит неиспользуемые и висящие изображения. Следовательно, любые изображения, используемые в контейнере, вне зависимости от того, были ли они завершены или запущены в данный момент, НЕ будут затронуты.

Нирбхай Сингх
источник