Як видалити старі контейнери Docker

Це питання пов'язане з Чи варто мене турбувати про надлишкові, не працює, контейнери Docker? .

Мені цікаво, як видалити старі контейнери. docker rm 3e552code34a дозволяє видалити один, але я вже маю лот. docker rm --help не надає опцію вибору (як і всі, або за назвою зображення).

Можливо, є каталог, в якому зберігаються ці контейнери, де їх можна легко видалити вручну?

996
@VonC це не працює для мене в Docker версії 1.12.3, побудувати 6b644ec :)
додано Автор ReynierPM, джерело
Також можна скористатися прапором docker за допомогою прапора --rm , який зробить контейнер ефемерним, видаливши всі файли контейнерів після виконання.
додано Автор Gordon, джерело
За допомогою докера 1.13 (Q4 2016) можна також розглянути нову команду docker system prune . Див. мою відповідь нижче .
додано Автор VonC, джерело
Слід також подумати про очищення сиріт за допомогою докерів. Я часто вважаю, що вони споживають набагато більше місця, ніж старі контейнери та старі зображення. Хороший сценарій для видалення сиріт-докерів доступний за адресою: github.com/chadoe/docker-cleanup-volumes .
додано Автор Nemanja Trifunovic, джерело
Я згоден з @NemanjaTrifunovic. Звернути увагу. Збережіть це у вашому toolbok: об'єм докера ls -f dangling = true
додано Автор bitfox, джерело
Можливо, вам допоможе github.com/chadoe/docker-cleanup-volumes .
додано Автор user1929959, джерело
docker rm -f $ (доксер ps -a -q)
додано Автор sony vizio, джерело

51 Відповіді

There is a new feature in Docker 1.13.x called Docker container prune: docker container prune

Це зробить те, що ви хочете, і повинні працювати на всіх платформах так само.

Також існує вирівнювання системи Docker : система докерів < code>, який очистить контейнери, зображення, томи і мережі в одній команді.

Оригінальний відповідь:

Були деякі розмови про команду очищення Docker. Ви можете знайти інформацію про цей квиток: Введіть команду "clean" (# 928)

До тих пір, поки ця команда не буде доступна, ви можете вказувати команди Docker разом з іншими командами Unix, щоб отримати потрібне. Ось приклад того, як очистити старі контейнери, яким виповнилося кілька тижнів:

$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm

Для надання кредиту, де він призначений, цей приклад наведено в https://twitter.com/jpetazzo/status/ 347431091415703552 .

1115
додано
Це рішення добре працює, якщо потрібно видалити контейнери залежно від їхнього віку. Що я хотів би зробити (і я припускаю, що я не один в цьому), щоб видалити все, що не в графі залежності залежності деяких зазначених контейнерів. Я виявив, що під час розробки Dockerfile кількість контейнерів зростає дуже швидко. Крім того, просто видалити все не є ідеальним або у випадку, якщо у вас є довгі запущені компіляції у вашому стилю. Якщо хтось має уявлення про те, як з цим впоратися, я буду дуже радий за ваш внесок.
додано Автор Michel Müller, джерело
@FreekKalter Цікаво - але це не означає, що контейнери видаляються, що будівельний процес використовується для кешування? У такому випадку він робить абсолютно протилежне тому, що я хочу - я хочу видалити контейнери, на яких не працює жодний контейнер або зображення з тегами. постійно зберігаючи проміжні кроки, що призвели до ніде.
додано Автор Michel Müller, джерело
Ця команда переплітає механізм і політику. Чому потрібно видаляти тижневі зображення, хоча це може бути досі актуальним. Крім того, ця команда покладається на вискоблювання. використання параметрів "-aq" є більш перспективним.
додано Автор hbogert, джерело
Не працює на OSX отримати xargs: незаконний варіант - - . Питання не вказує Linux, тому відповідь на Ryan Walls наведена нижче, тому що вона більш лаконічна і працює на платформі (linux і osx).
додано Автор Ray, джерело
Вам слід скористатися: docker ps -a --no-trunc | egrep '((тижнів) | (місяці)) тому' | awk '(print $ 1)' | xargs - не-run-if-empty docker rm . Він також видаляє контейнери місяців (докер використовує місяці після 12 тижнів). Це також дозволяє уникнути двозначності.
додано Автор Matt3o12, джерело
@Ghjnut ваш був єдиним, який, нарешті, працював для мене на Mac, хоча мені довелося змінити його трохи. docker rmi $ (зображення докера -a -q) всі інші, які я спробував відмовитися від чого-небудь, давши повідомлення про 'залежні дитячі зображення'. Той, хто вирішить запустити це, стежте за тим, що він видаляє абсолютно все.
додано Автор mwarren, джерело
Я використовую Mac OS 10 Yosemites і це рішення, здається, не працює (навіть якщо я додав sudo перед командою).
додано Автор Shih-Min Lee, джерело
@ MichelMüller зображення є тим, що використовується для кешування, тому видалення контейнерів не вплине на це.
додано Автор Ken Cochrane, джерело
Ви дійсно повинні просто використовувати докер контейнер підрізати, повинні працювати на всіх платформах.
додано Автор Ken Cochrane, джерело
Варто зауважити, що ви можете замінити grep… | awk лише за допомогою awk .
додано Автор Michael Le Barbier Grünew, джерело
Дякую! До речі, неможливо позначити контейнери, чи не так? Наприклад, можна мати зображення бази даних, з яких примірник (контейнер) може містити цінні дані. Іншим цінним інструментом може бути прапор контейнера як "використаний", що захищає його від "docker rm".
додано Автор qkrijger, джерело
Зауважте, що ці коментарі я викладу в тому, що ви згадали
додано Автор qkrijger, джерело
Якщо ви отримали помилки з відмовою в дозволі, додайте sudo перед докером за останньою командою: $ sudo docker ps -a | grep 'тижні тому' | awk '(print $ 1)' | xargs --не-run-if-empty sudo docker rm -f
додано Автор Luciano Bargmann, джерело
Якщо ви хочете використовувати awk для цього розглянути цю команду, якщо ви хочете зробити RM всі зупинені контейнери (без помилки через перший рядок): docker ps -a | awk 'NR> 1 {print $ 1}' | xargs docker rm
додано Автор masi, джерело
@ MichelMüller під час створення зображення з докера ви можете вказати опцію -rm , щоб видалити проміжні контейнери після успішного збирання.
додано Автор Freek Kalter, джерело
Це має бути оновлена ​​команда для видалення зображень без тегів docker rmi $ (зображення докера -q -f dangling = true)
додано Автор Ghjnut, джерело
Використовуючи найновіший Docker, використовуйте docker container prune . Якщо ви не можете використовувати найновішу версію Docker, скажіть, якщо ви використовуєте найновішу версію Minikube v0.21, у якій немає найновішого Docker, скористайтеся більш простим статусом docker rm $ (docker ps -q --filter) = exited ")
додано Автор clay, джерело
Якщо є багато контейнерів/зображень, ви можете використовувати docker ps -aq | tr '\ t xargs - не-run-if-empty docker rm . Вихід, що передається до докера, буде об'єднаний в один рядок, тому буде виконано лише одну команду докера. Це трохи прискориться.
додано Автор spinus, джерело
Виходячи з цього ID коментаря зробив скрипт очищення для видалення старих контейнерів різного віку. Ви можете отримати його тут:
додано Автор Juancho, джерело
НЕБЕЗПЕЧНО !!!! ВИКОРИСТОВУЙТЕ ЇЇ ОБЕРЕЖНО! Завдяки другій команді grep, вона також поверне вам рядки, де написано "створено X тижнів тому", тому ви могли б потенційно закінчити видалення нещодавно створених контейнерів!
додано Автор SKR, джерело
Подібна команда для видалення всіх немаркованих зображень: docker images | grep "" | awk '{print $ 3}' | xargs docker rmi
додано Автор Mohan Raj, джерело

Інший метод, який я отримав від Гійома Дж. Шармса (кредит там, де це потрібно):

docker rm `docker ps --no-trunc -aq`

Вилучити всі контейнери елегантно.

І Бартош Біліцький, для Windows:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

Для PowerShell:

docker rm @(docker ps -aq)

Оновлення за допомогою Docker 1.13 (четвертий квартал 2016 року)./a/39860665/6309 "> пізніше в цій темі ):

docker system prune will delete ALL unused data (i.e., in order: containers stopped, volumes without containers and images with no containers).

Див. PR 26108 і фіксувати 86de7c0 , які вводять кілька нових команд, які допомагають візуалізувати, скільки простору дані демона Docker беруть на диск і дозволяють легко очистити" непотрібні " надлишок.

docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y
584
додано
Я не бачу точку з --no-trunc , оскільки docker rm так і не потребує повних ідентифікаторів.
додано Автор Pithikos, джерело
@IhorKaharlichenko, я все для xargs - але, до цих пір, в коментарі qkrijger не було додано жодного башизму - або ви вважаєте $() башизмом?
додано Автор maxschlepzig, джерело
це якимось чином не працює для мене, але docker ps -a -q | xargs docker rm працює (може знадобитися sudo)
додано Автор FUD, джерело
@qkrijger, це не змінює нічого з вашої оригінальної відповіді, крім додавання башизму. Проблема полягає в переповненні командного рядка. Варіант xargs має справу з ним у гарний спосіб. Я б також додав --no-trunk до docker ps, щоб уникнути (малоймовірно) зіткнення id.
додано Автор Ihor Kaharlichenko, джерело
@maxschlepzig, я не пам'ятаю, що саме я думав при написанні цього коментаря, так що давайте розглянемо це як помилку. Ні в якому разі код $() не є башизмом, тим більше, що мітки IIRC вважаються застарілими, а $() є рекомендованим способом.
додано Автор Ihor Kaharlichenko, джерело
пам'ятайте, якщо ви використовуєте тільки контейнер даних, він також видалить їх
додано Автор nXqd, джерело
щойно зберегла мене 13gb
додано Автор Christian Bongiorno, джерело
@qkrijger hm, це вірно. Вони використовують -notrunc для <0.8 docs.docker.io/en/ v0.7.3/commandline/cli/# ps та --no-trunc для 0.8 docs.docker.io/en/latest/reference/commandline/cli/#ps І я не знайшов жодних згадок про це в CHANGELOG.
додано Автор chuwy, джерело
Версія PowerShell: докер ps -aq --не-trunc | % {docker rm $ _}
додано Автор Joe Niland, джерело
З цієї публікації ( gist.github.com/ngpestelos/4fc2e31e19f86b9cf10b ): параметр Power Shell & ' C: Файли програм Docker 'ps -a | foreach-об'єкт {$ l = $ PSItem.ToString (); $ c = $ l.Supstring (0, $ l.IndexOf ("")); if ($ c.ToLower() -ne "контейнер") {$ cmd = "c: Програмні файли Docker docker.exe"; & $ cmd "rm" $ c}}
додано Автор evgenyl, джерело
@FUD подібно до вашої команди та додайте -f , щоб примусити при необхідності, тоді це docker ps -a -q | xargs docker rm -f
додано Автор Larry Cai, джерело
Я використовував для видалення старих зображень з обраного відповіді, але з якихось причин не міг (докер rmi помилявся з деякими дивні теги, відмінні від пройшли). Тоді я скористався цією командою - вона зробила "щось", можливо, вилучила висячі зображення? У всякому разі, виправлена ​​перша команда - яка ефективно очистила мої зображення repo;)
додано Автор hauron, джерело
Я пробував багато речей, і це єдина, яка працювала для мене
додано Автор Ashley Coolman, джерело
docker rm $ (docker ps -a -q) завершується невдало, якщо не існує можливості для видалення
додано Автор Lobo, джерело
як щодо docker rm $ (docker ps -a -q) ?
додано Автор qkrijger, джерело
@IhorKaharlichenko Ви праві, спасибі за розробку. Крім того, гарна ідея на опції notrunc. Я оновлював відповідь з ним і також оновлював свої сценарії
додано Автор qkrijger, джерело
@chuwy Моя установка докера 0.7.x має -notrunc
додано Автор qkrijger, джерело
@Pithikos - це дуже невеликий шанс, що два хеши починаються з тих самих 8 букв. Справа в тому, що немає сенсу не використовувати весь хеш, коли ви скріншуєте
додано Автор qkrijger, джерело
Чому докер не має нормальної інерційної команди для цього? як: docker rm - all --force або docker rm-all-containers ?
додано Автор sobi3ch, джерело
Це працювало для мене на Win 8.1 з boot2docker. Я, напевно, не хотів би запускати його з будь-якою реальною установкою контейнерів, я просто хотів вичистити тестування, яке я створив.
додано Автор Kioshiki, джерело

Updated Answer Use docker system prune or docker container prune now. See VonC's updated answer.

Previous Answer Composing several different hints above, the most elegant way to remove all non-running containers seems to be:

докер rm $ (докер ps -q -f status = exited)

  • -q prints just the container ids (without column headers)
  • -f allows you to filter your list of printed containers (in this case we are filtering to only show exited containers)
389
додано
На відміну від правильної відповіді, @RyanWalls відповідає на OSX, а також є більш лаконічним.
додано Автор Ray, джерело
псевдонім може бути зручним: alias docker-gc = "docker rm -v \ t
додано Автор Frank Neblung, джерело
Ви можете додати -v , щоб уникнути висячих томів: docker rm -v $ (docker ps -q -f status = exited) . Див. docs.docker.com/userguide/ dockervolumes/& hellip; для отримання докладних відомостей про обсяги, що звисають.
додано Автор rluba, джерело
Це також працює під Windows з PowerShell.
додано Автор Tobias, джерело
@ rluba мабуть в Docker 1.9 буде окремий пристрій томів для обробки цієї проблеми. github.com/docker/docker/pull/14242
додано Автор Ryan Walls, джерело
Це повинна бути правильна відповідь, оскільки вона покладається на докер, щоб повідомити, які контейнери більше не використовуються, а не припускати, що формат виведення тексту $ (зображення докера) не зміниться. Бонусні бали за нерест тільки одного додаткового процесу замість двох.
додано Автор eurythmia, джерело
"docker rm" вимагає принаймні 1 аргументу.
додано Автор Xero, джерело

The official way is:

docker rm `docker ps -aq`

Супровідники Docker вказали, що не буде команди для цього - і ви складатимете такі команди:

Ми обговорювали це раніше і надаємо перевагу користувачам використовувати вищевказану лінію без додавання додаткового коду до Docker.

242
додано
Зверніть увагу, що це не буде працювати в Windows Powershell. Для цього це краще рішення: stackoverflow.com/a/23674294/1150683
додано Автор Bram Vanroy, джерело
Це поганий вибір, тому що він також видаляє контейнери для зберігання.
додано Автор Sobrique, джерело
@Sobrique Якщо ви не реагуєте, принаймні, ви повинні видалити свій коментар, це майже повна і шкідлива дурниця.
додано Автор peterh, джерело
Що ви маєте на увазі "контейнери для зберігання"? Якщо ви маєте на увазі контейнери з даними, які колись використовувалися для зберігання посилань на томи даних, вони більше не потрібні через наявність підкоманду об'єм докера і названих томів.
додано Автор L0j1k, джерело

Тепер у Docker 1.13 (Q4 2016) є:

docker system prune -a will delete ALL unused data (i.e., in order: containers stopped, volumes without containers and images with no containers).

docker system prune without -a will remove (for images) only dangling images, or images without a tag, as commented by smilebomb.

Див. PR 26108 і фіксувати 86de7c0 , які вводять декілька нових команд, які допомагають візуалізувати, скільки місця дані Docker-демона беруть на диск і дозволяють легко очистити непотрібний "надлишок".

docker system prune -a

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

Як wjv коментарі,

Існує також docker {контейнер, зображення, обсяг, мережа} , який може використовуватися для видалення невикористаних екземплярів простого одного типу об'єкта.

Введено в фіксувати 913e5cb , лише для Docker 1.13+.

docker container prune
106
додано
повинна бути позначена як правильна відповідь на теперішній час, більшість з вищезазначених повернулися в минуле, але вони є надто складними
додано Автор Eugen Mayer, джерело
Опис у кодовому блоці призначено для docker system prune -a , який видаляє невикористані зображення. docker system prune видаляє лише підвісні зображення або зображення без тегу.
додано Автор smilebomb, джерело
Змінено прапорець. Всі системи йдуть.
додано Автор smilebomb, джерело
Домовилися, набагато легше останнім часом, вгору, ви йдете!
додано Автор Maxim Geerinck, джерело
Як звичайно, додайте прапорець -f , щоб примусити очищення без запитань.
додано Автор Dirk, джерело
@smilebomb Хороший пункт. Я відредагував відповідь, щоб додати опцію -a . Чи можете ви перевірити це редагування?
додано Автор VonC, джерело
@smilebomb Спасибі \ t
додано Автор VonC, джерело
Дякуємо за обмін - щоб це стало видимим, я цитую вас у відповіді високо в потоці
додано Автор qkrijger, джерело
Я вас вже нагорів:)
додано Автор qkrijger, джерело

Тепер можна використовувати фільтрування за допомогою docker ps :

docker rm $(docker ps -q -f status=exited)

А для зображень :

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

Проте будь-яка з них призведе до того, що docker rm або docker rmi викине помилку, якщо немає відповідних контейнерів. Старший код docker rm $ (docker ps -aq) був ще гіршим, оскільки він намагався вилучити будь-який запущений контейнер, не працюючи на кожному.

Ось більш чистий скрипт, який можна додати у ~/.bashrc або ~/.profile :

# Use `docker-cleanup --dry-run` to see what would be deleted.

function docker-cleanup {
  EXITED=$(docker ps -q -f status=exited)
  DANGLING=$(docker images -q -f "dangling=true")

  if [ "$1" == "--dry-run" ]; then
    echo "==> Would stop containers:"
    echo $EXITED
    echo "==> And images:"
    echo $DANGLING
  else
    if [ -n "$EXITED" ]; then
      docker rm $EXITED
    else
      echo "No containers to remove."
    fi
    if [ -n "$DANGLING" ]; then
      docker rmi $DANGLING
    else
      echo "No images to remove."
    fi
  fi
}

Редагувати: як зазначено нижче, оригінальною відповіддю було видалення зображень, а не контейнерів. Оновлено, щоб відповідати на обидві, включаючи нові посилання на документацію. Завдяки Адріану (і відповіді Райана), згадавши нове фільтрування ps .

100
додано
Зверніть увагу на справжню пристрасть цього - ви не випадково вбиваєте зберігання conatiners.
додано Автор Sobrique, джерело
Ви також можете використовувати status = created , щоб отримати ті, які не виконуються і ніколи не запускалися.
додано Автор Elysian Fields, джерело

UPDATED 2017 (NEWEST)

docker container prune

Це - 2017 (OLD) спосіб

Щоб видалити ALL STOPPED CONTAINERS

docker rm $(docker ps -a -q)

To remove ALL CONTAINERS (STOPPED AND NON STOPPED)

docker rm  -f $(docker ps -a -q)
88
додано
downvoted, оскільки це, безумовно, не так, як ви робите це у 2017 році - якщо ви маєте docker volume/container/image prune , див. /stackoverflow.com/a/39860665/3625317">stackoverflow.com/a/39860665/3625317
додано Автор Eugen Mayer, джерело
працював для мене на OS X
додано Автор cljk, джерело
проголосували проти протилежного голосу, оскільки а) ця відповідь була з 2016 року, і б) багато людей не запускали кров.
додано Автор keen, джерело

Видалити всі зупинені контейнери:

docker rm $(docker ps -a | grep Exited | awk '{print $1}')

З коментаря: pauk960 :

З версії 1.3.0 можна використовувати фільтри з docker ps , замість grep Exited використовувати docker ps -a - f status = вийшов . І якщо ви використовуєте -q з ним, ви можете отримати ідентифікатори контейнерів тільки замість повного виводу, не потрібно використовувати awk для цього.

47
додано

If you do not like to remove all containers, you can select all containers created before or after a specific container with docker ps --before or with docker ps --since . This feature is at least in Docker version 0.6.5.

Припустимо, ви розробили свою систему, і тепер вона працює, але залишилося кілька контейнерів. Ви хочете видалити контейнери, створені до цієї робочої версії. Визначте ідентифікатор робочого контейнера за допомогою docker ps .

Видалення контейнерів, створених перед іншим контейнером

docker rm $(docker ps --before 9c49c11c8d21 -q)

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

Видалення контейнерів, створених після певного контейнера

docker rm $(docker ps --since a6ca4661ec7f -q)

Докер зберігає контейнери в /var/lib/docker/containers у Ubuntu. Я думаю, що додаткові контейнери не завдають ніякої іншої шкоди, але займають місце на диску.

31
додано

Update: As of Docker version 1.13 (released January 2017), you can issue the following command to clean up stopped containers, unused volumes, dangling images and unused networks:

docker system prune

Якщо ви хочете переконатися, що ви видаляєте лише контейнери зі статусом exited , використовуйте це:

docker ps -aq -f status=exited | xargs docker rm

Аналогічно, якщо ви очищаєте матеріали докера, ви можете позбутися незміщених, неназваних зображень таким чином:

docker images -q --no-trunc -f dangling=true | xargs docker rmi
29
додано

Ось скрипт docker-cleanup , який видаляє немаркіровані контейнери та зображення. Будь ласка, перевірте джерело оновлень.

#!/bin/sh
# Cleanup docker files: untagged containers and images.
#
# Use `docker-cleanup -n` for a dry run to see what would be deleted.

untagged_containers() {
  # Print containers using untagged images: $1 is used with awk's print: 0=line, 1=column 1.
  docker ps -a | awk '$2 ~ "[0-9a-f]{12}" {print $'$1'}'
}

untagged_images() {
  # Print untagged images: $1 is used with awk's print: 0=line, 3=column 3.
  # NOTE: intermediate images (via -a) seem to only cause
  # "Error: Conflict, foobarid wasn't deleted" messages.
  # Might be useful sometimes when Docker messed things up?!
  # docker images -a | awk '$1 == "" {print $'$1'}'
  docker images | tail -n +2 | awk '$1 == "" {print $'$1'}'
}

# Dry-run.
if [ "$1" = "-n" ]; then
  echo "=== Containers with uncommitted images: ==="
  untagged_containers 0
  echo

  echo "=== Uncommitted images: ==="
  untagged_images 0

  exit
fi

# Remove containers with untagged images.
echo "Removing containers:" >&2
untagged_containers 1 | xargs --no-run-if-empty docker rm --volumes=true

# Remove untagged images
echo "Removing images:" >&2
untagged_images 3 | xargs --no-run-if-empty docker rmi

Source: https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup

19
додано
@BradMurray Дякуємо! Вам також можуть сподобатися такі:
додано Автор blueyed, джерело
Не працює в OSX через опцію xargs --no-run-if-empty
додано Автор caktux, джерело

Видалення всіх контейнерів з оболонки Windows:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
10
додано
"з оболонки Windows" ? Ви маєте на увазі "використання оболонки Windows (CMD)" ?
додано Автор Peter Mortensen, джерело
Я включу це у свою відповідь, оскільки це перша сторінка. Дякую
додано Автор qkrijger, джерело

По-перше, зупиніть роботу контейнерів, перш ніж намагатися їх видалити

Зніміть працюючі контейнери

docker rm $(docker stop -t=1 $(docker ps -q))

Ви можете використовувати kill замість stop . У моєму випадку я віддаю перевагу stop , тому що я намагаюся повторно їх створювати, а не створювати новий кожен раз, тому я намагаюся добре закрити їх.

Note: Trying to stop a container will give you an error:

Помилка: неможливо видалити запущений контейнер, припиніть його спочатку

Видаліть всі контейнери

docker rm $(docker ps -a -q)
10
додано

https://github.com/HardySimpson/docker-cleanup

Очищення Docker

Крихітна оболонка "все-в-одному", яка видаляє:

  • Контейнери, які не запущено більше одного дня
  • Зображення, які не належать до будь-якого контейнера

Планується працювати як робота crontab

Особливість

  • It will remove all : images
  • If the image has multiple repo:tag references to it, it will remove all repo:tag except with running a container. Actually it is a nature of "docker rmi".
  • Many error message will be show on screen, and you can decide to 2>/dev/null or not
  • Learn something from docker-gc, and fix its problem (it can not remove image that has mutliple repo:tag)
7
додано

Використання:

docker rm -f $(docker ps -a -q)

Він примусово зупиняє і видаляє всі наявні контейнери на місці.

7
додано
як плюс, це також працює в Windows під powerhell!
додано Автор Robert Ivanc, джерело
@Elliott Я думаю, що sudo потрібний скрізь, якщо ви не додасте користувача до групи "docker". Я використовую Ubuntu 16.10 без sudo, додавши мого користувача до групи докерів.
додано Автор emory, джерело
Будь-ласка, відредагуйте додаткову інформацію. Відповіді на коди і "спробувати це" не рекомендуються, оскільки вони не містять вмісту для пошуку і не пояснюють, чому хтось повинен "спробувати це". Ми робимо тут зусилля, щоб стати ресурсом для знань.
додано Автор Brian Tompsett - 汤莱恩, джерело
У Ubuntu 16.04 докер вимагає sudo, тому вам потрібно написати sudo docker rm -f $ (sudo docker ps -a -q) .
додано Автор Elliott, джерело

Отже, особисто я рекомендую робити це як частину сценарію розгортання як для зображень, так і для контейнерів, зберігаючи тільки найновіші n контейнерів і зображень. Я позначаю свої зображення Docker тією ж схемою версій, яку я використовую з тегом git , а також завжди позначую останнє зображення Docker за допомогою "latest". Це означає, що без очищення будь-яких зображень мої зображення Docker виглядають так:

REPOSITORY              TAG       IMAGE ID        CREATED         VIRTUAL SIZE
some_repo/some_image    0.0.5     8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    latest    8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    0.0.4     0beabfa514ea    45 hours ago    925.4 MB
some_repo/some_image    0.0.3     54302cd10bf2    6 days ago      978.5 MB
some_repo/some_image    0.0.2     0078b30f3d9a    7 days ago      978.5 MB
some_repo/some_image    0.0.1     sdfgdf0f3d9a    8 days ago      938.5 MB

Тепер, звичайно, я не хочу, щоб всі мої зображення (або контейнери) поверталися до безкінечності на всіх моїх виробничих боксах. Я просто хочу останні 3 або 4 для відкату і позбутися від всього іншого. хвіст Unix - ваш найкращий друг тут. Оскільки зображення докера і docker ps обидва порядку за датою, ми можемо просто скористатися хвостом , щоб вибрати всі, окрім перших трьох, і видалити їх:

docker rmi $(docker images -q | tail -n +4)

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

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

docker rm $(docker ps -aq | tail -n +4)

Нарешті, у моєму спрощеному прикладі ми маємо справу тільки з одним сховищем одночасно, але якщо у вас було більше, ви можете отримати трохи більш складні з тією ж ідеєю. Скажімо, я просто хочу зберегти останні три зображення з some_repo/some_image. Можу просто змішувати grep і awk і бути на своєму шляху:

docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)

Знову ж таки, одна й та сама ідея стосується контейнерів, але ви отримаєте це до цього моменту, тому я перестану наводити приклади.

6
додано

Видалити всі зупинені контейнери.

sudo docker rm $ (sudo docker ps -a -q)

Це призведе до видалення всіх зупинених контейнерів шляхом отримання списку всіх контейнерів з докером ps -a -q та передачі їх ідентифікаторів до докера rm. При цьому не слід видаляти будь-які запущені контейнери, і він повідомить, що він не може видалити виконане зображення.

Видалити всі зображення без тегів

Тепер потрібно очистити старі зображення, щоб заощадити місце.

sudo docker rmi $ (зображення suk docker -q - фільтр "dangling = true")

5
додано
Це працює тільки в Linux, а не в Windows ... Але docker rm -f $ (docker ps -a -q) працює в PowerShell/Docker для Windows.
додано Автор Peter Mortensen, джерело
Не забувайте видаляти томи докера, вказавши опцію -v (sudo docker rm -v $ (sudo docker ps -a -q))
додано Автор vcarel, джерело
Не шукали цього, але, напевно, те ж саме: docker ps -aq | xargs docker rm -v
додано Автор quine, джерело

Видаліть 5 найстаріших контейнерів:

docker rm `docker ps -aq | tail -n 5`

Подивіться, скільки контейнерів залишилося:

docker ps -aq | wc -l
4
додано

New way: spotify/docker-gc play the trick.

 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
  • Контейнери, які вийшли більше години тому, видаляються.
  • Зображення, які не належать до жодного контейнера після цього, видаляються

Вона підтримує налаштування навколишнього середовища

Примусове видалення зображень із кількома тегами

 FORCE_IMAGE_REMOVAL=1

Примусове видалення контейнерів

 FORCE_CONTAINER_REMOVAL=1 

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

 GRACE_PERIOD_SECONDS=86400

Цей параметр також запобігає видаленню зображень, створених менше ніж GRACE_PERIOD_SECONDS секунд тому.

Сухий пробіг

 DRY_RUN=1

Cleaning up orphaned container volumes CLEAN_UP_VOLUMES=1

Reference: docker-gc

Старий спосіб:

видаляти старі, не виконуючі контейнери

 docker ps -a -q -f status=exited | xargs --no-run-if-empty docker rm
             OR 
 docker rm $(docker ps -a -q)

видаляти всі зображення, пов’язані з неактивними контейнерами докера

 docker images -q | xargs --no-run-if-empty docker rmi

Очищення сиріт для докерів для докерівської версії 1.10.x і вище

 docker volume ls -qf dangling=true | xargs -r docker volume rm

На основі періоду часу

 docker ps -a | grep "weeks ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "days ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "hours ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
4
додано
Цікава альтернатива. +1
додано Автор VonC, джерело
  1. Remove all docker processes:

    docker rm $(docker ps -a -q)
    
  2. Remove specific container:

    $ docker ps -a (lists all old containers)
    
    $ docker rm container-Id
    
4
додано

Для видалення виведених контейнерів можна скористатися наступною командою:

docker rm $(sudo docker ps -a | grep Exit | cut -d ' ' -f 1)

Ось повний зміст для видалення старих зображень на панелі документів. a>.

4
додано
Практично дубльований код
додано Автор Ryne Everett, джерело

Ви можете зупинити контейнер докера і після його зупинки можна видалити контейнер.

Зупинити контейнер:

$ docker stop "containerID" - you can also mention the first two letters of the container ID, and it works.

Зніміть контейнер

$ docker rm "containerID" - again you can also mention the first two letters of the container

If these command do not let you stop/Зніміть контейнерs, m,ake sure you have sudo access to docker host.

4
додано

Основні кроки для зупинки/видалення всіх контейнерів і зображень

  1. List all the containers

    docker ps -aq

  2. Stop all running containers

    docker stop $(docker ps -aq)

  3. Remove all containers

    docker rm $(docker ps -aq)

  4. Remove all images

    docker rmi $(docker images -q)

Note: First you have to stop all the running containers before you remove them. Also before removing an image, you have to stop and remove its dependent container(s).

4
додано

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

docker system prune -f
3
додано
Це дивовижне про-рада!
додано Автор b01, джерело

Ви можете видалити тільки зупинені контейнери. Зупиніть їх на початку

docker stop $ (docker ps -a -q)

Потім можна видалити

докер rm $ (докер ps -a -q)

3
додано
#!/bin/bash
# docker-gc --- Remove stopped docker containers

RUNNING=$(docker ps -q)
ALL=$(docker ps -a -q)

for container in $ALL ; do
    [[ "$RUNNING" =~ "$container" ]] && continue
    echo Removing container: $(docker rm $container)
done
3
додано
для тих, хто не хоче шукати його самі github.com/spotify/docker-gc
додано Автор grim, джерело

Для видалення всіх зображень я завжди використовую docker rmi $ (docker ps -a -q) .

Ви можете видалити каталог /var/lib/docker/graph , якщо docker rmi не вдалося.

3
додано
Цей коментар вже опубліковано.
додано Автор qkrijger, джерело
Дякуємо за додавання інформації про/var/lib/docker/graph
додано Автор Jonathan DeMarks, джерело
Питання полягало в тому, як видалити контейнери, а не зображення.
додано Автор pauk960, джерело

Щоб видалити всі контейнери без плакання:

sudo docker ps -a | grep -v CONTAINER | awk '{print $1}' | xargs --no-run-if-empty sudo docker rm -f
2
додано

Якщо потрібно автоматично/періодично очищати вилучені контейнери та видаляти зображення та томи, які не використовуються запущеним контейнером, ви можете завантажити зображення meltwater/docker-cleanup .

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

Просто запустіть:

docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw  -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest

Він запускається кожні 30 хвилин за замовчуванням (або як довго ви встановлюєте його за допомогою DELAY_TIME = 1800) і очищати витіснені контейнери та зображення.

More details: Docker Cleanup

2
додано

На Ubuntu 14.04 (Trusty Tahr):

$ for CON in `docker ps -qa`; do docker rm $CON ; done

Це просто звичайна команда Bash, тому вона повинна працювати зі всіма Bash-сумісними терміналами.

2
додано
Чи буде перший код $ введений в термінал (або він є частиною підказки?)?
додано Автор Peter Mortensen, джерело
@PeterMortensen перший $ означає тільки, що це командний рядок en.wikipedia org/wiki/Command-line_interface # Command_prompt
додано Автор sobi3ch, джерело

Видалити всі контейнери, створені з певного зображення:

docker rm  $(docker ps -a | awk '/myimage:mytag/{print $1}')
2
додано
Приємно, мені це подобається: D
додано Автор qkrijger, джерело

Для всіх, хто цікавиться, я взяв приклад з qkrijger і перетворив його на все (зупинитися і видалити все)

docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`
2
додано
Якщо ви видаляєте контейнери, то docker rm -f $ (docker ps --no-trunc -aq)
додано Автор qkrijger, джерело
погодилися, що це дуже вірогідний варіант використання
додано Автор qkrijger, джерело
Правда, але якщо вам потрібно, щоб пройти належне вимикання для очищення спільних або повторно використовуваних ресурсів (наприклад, прикріплених томів, правильно закритих активних з'єднань і т.д.), вам потрібно спочатку викликати зупинку. Чудовий приклад, якщо у вас є контейнер Jenkins, то вбивство контейнера є поганою ідеєю. Ви хочете, щоб він зберігав будь-які непомітні зміни, попереджав увійшли в систему користувачів, і, що дуже важливо, правильно зупинили всі побудови.
додано Автор Kraig McConaghy, джерело

Для видалення контейнерів можна використовувати деякі програми Docker UI.

Вибачте за рекламу, але я завжди використовую власну програму, щоб робити те ж саме. Ви можете спробувати, якщо ви шукаєте просте додаток для керування зображеннями або контейнерами Docker: https://github .com/alex-agency/AMHub .

Це веб-додаток Docker UI, який працює у контейнері Docker. Для його встановлення потрібно лише викликати цю команду:

docker run -d -p 80:80 -p 8000:8000 -e DOCKER=$(which docker) -v /var/run/docker.sock:/docker.sock alexagency/amhub
2
додано
Чи можете ви насправді пояснити, як можна досягти того, чого хоче оригінальний запитувач? Вони, здається, стурбовані тим, що вони мають багато сиріт, які виснажують. Додавання іншого виглядає як незадовільне рішення ...
додано Автор Johan Sundström, джерело
docker rm --force `docker ps -qa`
2
додано

Я пропоную вам зупинити зображення, а потім видалити.

Можна йти так:

$ docker stop $(docker ps -a)
$ docker rm $(docker ps -a)
2
додано
Це буквально $ docker (зі знаком долара)? Або $ підказка оболонки?
додано Автор Peter Mortensen, джерело
$ для командного рядка. спасибі за вказівку. додав простір
додано Автор Siena, джерело

Використовуйте такі вкладені команди:

$ sudo docker stop $(sudo docker ps -a -q)

Ця команда зупиняє всі запущені контейнери.

$ sudo docker rm $(sudo docker ps -a -q)

Ця команда видаляє всі контейнери.

1
додано

Я знайшов команду нижче дуже зручно зупинити і видалити всі контейнери. Вам не потрібно явно зупинятися з іншою командою, якщо ви використовуєте прапорець -f (force), коли він зупиняє всі запущені контейнери:

docker rm -f $(docker ps -a -q)
1
додано

Ось один лайнер, який видаляє всі викинуті контейнери.

докер rm $ (докер ps -a | grep Вихід | grep -v CON | awk '{print $ 1}')

Якщо ви хочете видалити всі зображення, ви можете використовувати щось подібне.

docker rmi $ (зображення докера | sed -n '1! p' | awk '{print $ 3}')

1
додано
#!/bin/bash

echo Cleanup unused containers
unused_containers=$(docker ps -a -q --filter="status=exited")
if [[ -n $unused_containers ]]
then
  docker rm $unused_containers
fi

echo Cleanup unused images
unused_images=$(docker images | grep '^' | awk '{print $3}')
if [[ -n $unused_images ]]
then
  docker rmi $unused_images
fi
1
додано
Коли ви відповідаєте, краще мати якесь пояснення щодо того, що рішення робить, а не тільки дамп коду, оскільки в іншому випадку відповідь може бути видалена.
додано Автор AlBlue, джерело

Видалення старих контейнерів Docker дуже легко.

Перерахуйте всі контейнери:

docker ps -a
docker ps (To list the running containers)

Після того, як ви натиснете docker ps -a , воно надасть вам список контейнерів разом з ідентифікатором контейнера (який є унікальним і комбінацією a-z, A-Z і 0-9). Скопіюйте ідентифікатор контейнера, який ви хотіли видалити, і просто натисніть на кнопку нижче.

docker rm container_id

Ваш контейнер буде видалено разом з шарами, створеними в /var/lib/docker/aufs (якщо ви використовуєте Ubuntu).

1
додано

Я використовую такі варіанти:

docker ps -a | grep 'cassandra.*Exited' | cut -d " " -f 1

У першій частині перераховані всі процеси.

Другий вибирає тільки тих, які мають 'cassandra', а потім 'Exited'.

Третій, видаляє всі тести після ідентифікатора зображення, тому ви отримуєте список ідентифікаторів зображень.

Тому,

docker rm $(docker ps -a | grep 'cassandra.*Exited' | cut -d " " -f 1)
0
додано

Для інсталяції Linux переконайтеся, що ви використовуєте sudo . Також добре шукати зображення, які складаються з місяців і тижнів:

sudo docker ps -a | grep 'weeks ago\|months ago' | \
    awk '{print $1}' | xargs --no-run-if-empty sudo docker rm
0
додано
переконайтеся, що ви прочитали інструкції з установки для докера на linux, щоб уникнути необхідності sudo
додано Автор qkrijger, джерело

Щоб просто видалити все те, що не використовується поточним контейнером, наступний псевдонім , який я зазвичай вкладаю в .bash_profile на моєму Mac, допоможе:

alias dockerclean="docker ps -q -a | xargs docker rm -v && docker images -q | xargs docker rmi"

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

0
додано

З мого досвіду, ви повинні зупинити контейнери, перш ніж видалити їх, щоб уникнути таких помилок, як "цей контейнер все ще працює", так:

sudo /usr/bin/docker ps -aq |  awk '{print $1}' | \
xargs --no-run-if-empty bash -c 'sudo docker stop [email protected]; sudo docker rm [email protected]' bash

Я зберігаю псевдонім у моїх точкових файлах, наприклад:

alias wipedocker="sudo /usr/bin/docker ps -aq |  awk '{print $1}' \
| xargs --no-run-if-empty bash -c 'sudo docker stop [email protected]; sudo docker rm [email protected]' bash"
0
додано
Ви можете передати прапорець -f до докера для видалення запущеного контейнера.
додано Автор Marcello Romani, джерело

Цей короткий сценарій може допомогти (складений з попередніх відповідей)!

#!/bin/bash

# Remove dangling images

IMAGE_IDS=$(sudo docker images -f "dangling=true" -q)

if [ -n "$IMAGE_IDS" ]; then

    sudo docker rmi $IMAGE_IDS > /dev/null 2>&1
    echo 'Images removed' $IMAGE_IDS
fi


# Remove exited containers

CONTAINER_IDS=$(sudo docker ps -a -q -f status=exited)

if [ -n "$CONTAINER_IDS" ]; then

    sudo docker rm -v $CONTAINER_IDS > /dev/null 2>&1
    echo 'Containers remove $CONTAINER_IDS'
fi
0
додано
Форматування цієї відповіді порушено. Чи повинен він бути одним або двома скриптами?
додано Автор JohnC, джерело
це єдиний скрипт ..запустити редагування
додано Автор Chetan Sharma, джерело

Цей процес містить два кроки (зупинка та видалення):

  1. Stop the container that is being used by any running microservices

    docker stop $(docker ps -a -q)
    
  2. Remove all the containers

    docker rm $(docker ps -a -q)
    
  3. Remove single container

    docker rm container-ID
    
0
додано

Я використовую:

docker rm -v $(docker ps -a -q -f status=exited)

видаляти вихідні контейнери та:

docker rmi -f $(docker images | grep "" | awk "{print \$3}")

для того, щоб позбутися всіх немаркованих зображень.

0
додано

docker rm -f $(docker ps -a -q) will do the trick. It will stop the containers and remove them too.

0
додано

Ці два рядки Bash фільтрують контейнери за деякими ключовими словами, перш ніж видалити їх:

containers_to_keep=$(docker ps -a | grep 'keep\|Up\|registry:latest\|nexus' | awk '{ print $1 }')
containers_to_delete=$(docker ps -a | grep Exited | grep -Fv "$containers_to_keep" | awk '{ print $1 }')
docker rm $containers_to_delete

Від цього повідомлення

0
додано

Ось скрипт для видалення 2-денних контейнерів:

#!/bin/bash
# This script will kill and remove containers older than 2 days.
#
docker ps -aq > /scripts/containers.txt
today=`date +%Y-%m-%d`
oldate=`date --date="2 day ago" +%Y-%m-%d`
while read p; do
    cont=`docker inspect -f '{{ .Created }}' $p | cut -c 1-10`
    echo " Created date of $p is $cont"
    k=`echo $(( ( $(date -ud $today +'%s') - $(date -ud $cont +'%s'))/60/60/24 ))
    echo $k
    if [ $k -ge 2 ];
    then
            echo "Killing docker container $p"
            docker kill $p
            echo "Removing docker container $p"
            docker rm $p
    else
            echo "Docker container $p is not one day old, so keeping the container."
    fi
done 
0
додано

Можна скористатися допоміжним пристроєм-докером з репозиторію >. Після установки просто введіть drmc .

0
додано