Що таке звисаючий образ, а що - невикористаний образ?


155

У документації докера обрізки зображення докера можна використовувати прапор -a для

Видаліть усі невикористані зображення, а не лише звисаючі

і пізніше

Видаліть усі звисаючі зображення. Якщо вказано -a, також буде видалено всі зображення, на які не посилається жоден контейнер.

Чи може хтось пояснити мені, що таке звисаючі зображення та яка різниця між звислими та невикористаними зображеннями?


docke image prune (без -а) робить точно так само, хоча
герм

Це не вдасться, коли ви користуєтесь цим у джинкінах, ми втратимо резервну копію докера у виробництві, якщо ми залежимо від кеша зображень докера. pruneне рекомендується у виробництві /
Джинна Балу

Відповіді:


153

Невикористане зображення означає, що воно не було призначено та не використовується в контейнері. Наприклад, під час запуску docker ps -a- в ньому будуть перераховані всі наявні та запущені контейнери. Будь-які зображені зображення, які використовуються всередині будь-яких контейнерів, є "використаним зображенням".

З іншого боку, звисаюче зображення просто означає, що ви створили нову збірку зображення, але йому не дали нової назви. Тож старі образи, які у вас є, стають "звислим зображенням". Це старе зображення - це те, яке не позначається і " <none>" відображає його ім'я під час запуску docker images.

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


Згідно з документацією при запуску докер-пруна без -видаляються лише звисаючі зображення. -а забезпечить видалення невикористаних зображень? docs.docker.com/engine/reference/commandline/system_prune
гермафродит



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

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

Примітка. Рекомендую не використовувати 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

Коли ми запускаємо будь-які завдання з керування, щоб видалити ті, що звисають, використовуйте вище, щоб переконатися, що робота успішно працює. Як і в Дженкінсі, якщо ми виконуємо роботу у вільному стилі з комерційною роботою, яка ніколи не вийде з ладу, навіть якщо в машині немає ніяких звисаючих речей.

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


2
що з донером на зображенні докера? Документи кажуть: "Видаліть всі звисаючі зображення. Якщо вказано -a, також буде видалено всі зображення, на які не посилається жоден контейнер." docs.docker.com/engine/reference/commandline/image_prune / ...
гермафродит

2
@herm, внизу сторінки, на яку ви посилаєтесь "Примітка. Вам буде запропоновано підтвердити, перш ніж чорнослив нічого не видалить, але вам не буде показано список того, що потенційно буде видалено". Я думаю, що в цій відповіді сенс полягає в тому, що ви можете отримати список звислих зображень, який ви явно вказуєте видалити, на відміну від сліпого видалення всіх висячих зображень з чорносливом.
bzier

Зображення, які мають ім’я та тег, як жоден у docker imagesних, розвішуються. Як перевірити їх розмір? Крім того, зображення, що мають ім'я та теги як жодні, docker images -aє проміжними зображеннями. Чи можна їх видалити і як перевірити їх розмір?
змінна

17

Зображення в докер-файлі посилаються на дайджест sha256, який часто називають ідентифікатором зображення. Цей дайджест - це все, що потрібно, щоб зображення існувало на хості докера. Зазвичай у вас будуть теги, які вказують на ці дайджести, наприклад, тег зайнятий: останні поточні точки до зображення id c30178c523 ... у моїй системі. Кілька тегів можуть вказувати на одне зображення, і будь-який тег можна змінити, щоб він вказував на інший ідентифікатор, наприклад, коли ви витягуєте нову копію зайнятої скриньки: останню або будуєте нову версію зображення програми.

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

Крім того, можливо, ви завантажили зображення, якими зараз не користуються контейнери (включаючи зупинені контейнери). Вони повністю відрізняються від звисаючих зображень і можуть бути безпечними для видалення до тих пір, поки ви не плануєте їх використовувати в майбутньому або не проти завантажувати іншу копію, коли вона вам потрібна.


Поки працює збірка докера (процес, в якому він створює шари та можливих кандидатів для майбутніх звисаючих зображень), у новому вікні, якщо я запускатимуть зображення докерного обрізання, чи вплине це на збірку, яка триває?
змінна

@variable там може бути стан перегонів, але, як правило, запущений контейнер для кроку збірки призведе до того, що зображення буде ідентифіковане як використовується. Найгірше, що може статися, це або чорнослив викидає помилку, або збірка робить, і вам доведеться її повторити. Я розглядаю, чи можете ви обмежити свій чорнослив, щоб уникнути зображень, які ви зараз використовуєте для створення, оскільки успішний чорнослив призведе до того, що майбутні збірки потребують завантаження зображень знову.
BMitch

Чи називаються посередницькими зображеннями (тими, у яких жодне ім’я / тег не відображається під час запуску docker images -a), також називаються забарвленими зображеннями? Чи їх очищають за допомогою дорізу зображення докера?
змінна

У мене більше немає таких у моєму середовищі (тут використовуються buildkit), тому рекомендую спробувати себе в лабораторних умовах, щоб побачити, що відбувається.
BMitch

Однак, видалення немечених "зображень" з проміжних етапів є досить безглуздим, якщо ви не видалите остаточне теговане зображення, всі шари повторно використовуються в пізнішому зображенні та їх неможливо видалити. Якщо ви видалите їх, ви знищите кеш збірки і змусите всі майбутні зображення займати більше часу для збирання та дискового простору для зберігання.
BMitch

5

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

Невикористане зображення - це зображення, яке не було призначено або використано в контейнері.

Список зображень, що звисають

docker images -f dangling=true

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"- оскільки немає -а - то як це видалити невикористані зображення?
змінна

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, це видалить як невикористані, так і звисаючі зображення. Тому будь-які зображення, які використовуються в контейнері, незалежно від того, вийшли вони або працюють зараз, НЕ впливатимуть.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.