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


1235

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

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

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


21
Слід також розглянути питання про очищення кількості сиріт. Я часто виявляю, що вони займають набагато більше місця, ніж старі контейнери та старі зображення. Хороший сценарій для видалення осиротілих томів докера доступний на веб-сайті: github.com/chadoe/docker-cleanup-volumes .
Неманья Трифунович

Можливо, github.com/chadoe/docker-cleanup-volumes може вам допомогти.
Mihai8

Ви можете також використовувати docker runз --rmпрапором , який зробить контейнер ефемерним, видаливши всі файли контейнер після запуску.
Гордон

12
З докер 1.13 (Q4 2016) ви також можете розглянути нову docker system pruneкоманду. Дивіться мою відповідь нижче .
VonC

1
Використовуйте інструмент управління докером Portainer Ми можемо керувати all the old containers, non using volumes and imagesза допомогою цього інструменту Його простий інтерфейс управління для докерів Please refer my update below on how to deploy the application
Аніш Варгез

Відповіді:


1460

З Docker 1.13.x ви можете використовувати контейнерний чорнослив Docker :

docker container prune

Це видалить усі зупинені контейнери і має працювати на всіх платформах однаково.

Також є система чорносливу Docker :

docker system prune

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


Для старих версій Docker ви можете накреслити команди 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 .


92
Подібна команда для видалення всіх нетазованих зображень: docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi
Mohan Raj

7
@ MichelMüller при складанні зображення з dockerfile ви можете вказати -rmопцію для видалення проміжних контейнерів після успішної збірки.
Фрік Калтер

3
@ MichelMüller зображення використовуються для кешування, тому вилучення контейнерів не призведе до цього.
Ken Cochrane

7
Якщо ви хочете використати awk для цього, розгляньте цю команду, якщо ви хочете зробити rm всі зупинені контейнери (без помилки через перший рядок):docker ps -a | awk 'NR > 1 {print $1}' | xargs docker rm
masi

3
Це має бути оновлена ​​команда для видалення docker rmi $(docker images -q -f dangling=true)
немальованих

626

Ще один метод, який я отримав від Гійом Дж. Чармеса (кредит, де це належить):

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 (Q4 2016), кредит VonC ( пізніше в цій темі ):

docker system prune видалить ВСІ невикористані дані (тобто для того, щоб контейнери зупинені, томи без контейнерів та зображення без контейнерів).

Дивіться 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

11
це якимось чином не працює для мене, але docker ps -a -q | xargs docker rmпрацює, (судо може знадобитися)
FUD

86
про що docker rm $(docker ps -a -q)?
qkrijger

8
@qkrijger, це не змінює нічого з вашої початкової відповіді, крім додавання башизму. Проблема полягає у переповненні командного рядка. xargs варіант справляється з цим приємно. Я також додав би --no-trunk до docker ps, щоб уникнути (навряд чи) зіткнення id.
Ігор Кахарліченко

8
Будьте в курсі, якщо ви використовуєте контейнер, призначений лише для даних, він також видалить їх
Dzung Nguyen,

4
Я не бачу сенсу, --no-truncоскільки docker rmне потребує повних посвідчень.
Пітікос

411

Оновлений відповідь Використовуйте docker system pruneабо docker container pruneзараз. Дивіться оновлену відповідь VonC .

Попередній відповідь Склавши кілька різних підказок, наведених вище, видається, що найелегантніший спосіб видалити всі не запущені контейнери:

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

  • -q друкує лише ідентифікатори контейнерів (без заголовків стовпців)
  • -f дозволяє фільтрувати ваш список надрукованих контейнерів (у цьому випадку ми фільтруємо, щоб відображати лише ті, що вийшли з контейнерів)

7
Це має бути правильною відповіддю, оскільки він покладається на docker, щоб повідомити, які контейнери більше не використовуються, а не припускаючи, що формат виводу тексту $ (docker images) не зміниться. Бонусні бали за нерест лише один додатковий процес замість двох.
eurythmia

18
Ви можете додати , -vщоб уникнути обірваних томів: docker rm -v $(docker ps -q -f status=exited). Дивіться docs.docker.com/userguide/dockervolumes/… для детальної інформації про звисаючі томи.
rluba

@rluba, мабуть, у Docker 1.9 з'явиться окрема томічна програма для вирішення цієї проблеми. github.com/docker/docker/pull/14242
Ryan Walls

псевдонім може бути корисним:alias docker-gc="docker rm -v \$(docker ps -q -f status=exited)"
Френк Неблунг

На відміну від відповіді, позначеної правильною, відповідь @RyanWalls працює як на OSX, так і більш стисло.
Рей

255

Офіційний спосіб :

docker rm `docker ps -aq`

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

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


6
Це погане рішення, оскільки воно також видалить контейнери для зберігання.
Sobrique

8
Що ви маєте на увазі "контейнери для зберігання"? Якщо ви маєте на увазі контейнери лише для даних, які колись використовувались для збереження посилань на томи даних, вони більше не потрібні через наявність docker volumeпідкоманди та названих томів.
L0j1k

Зауважте, що це не буде працювати в Windows Powershell. Для цього це краще рішення: stackoverflow.com/a/23674294/1150683
Брам Ванрой

@Sobrique Якщо ви не реагуєте, принаймні ви повинні видалити свій коментар, це майже повна і шкідлива дурниця.
петерх

128

З Docker 1.13 (Q4 2016) у вас є:

docker system prune -a видалить ВСІ невикористані дані (тобто для того, щоб контейнери зупинені, томи без контейнерів та зображення без контейнерів).

docker system pruneбез -a видалить (для зображень) тільки обірваних зображення або зображення без тега, так як зауважив по 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 {container,image,volume,network} prune, які можуть бути використані для видалення невикористаних екземплярів лише одного типу об’єктів.

Введено в програмі 913e5cb , лише для Docker 1.13+.

docker container prune

Дякую за те, що ви поділилися - щоб це стало видимим, я цитую вас у відповіді високо в темі
qkrijger

Як завжди, додайте -fпрапор, щоб примусити очистити без запитань.
Дірк

3
слід позначати як правильну відповідь сьогодні, більшість із вищезазначених були правильними у часі, але сьогодні є надскладними
Eugen Mayer

Домовились, набагато легше останнім часом, вгору ви йдете!
Максим Герінк

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

104

Тепер фільтрацію можна використовувати за допомогою 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фільтрацію.


2
Зверніть увагу на справжню перевагу цього - ви випадково не вб'єте storageконатинів.
Sobrique

3
Ви також status=createdможете отримати ті, які не запущені та ніколи не запущені.
Ендерленд

96

ОНОВЛЕНО 2019 (НОВОЕ)

docker container prune

Це - 2017 (СТАРИЙ) спосіб

Щоб видалити ВСІ СПОСТАНОВАНІ КОНТЕЙНЕРИ

docker rm $(docker ps -a -q)

Щоб видалити ВСІ КОНТЕЙНЕРИ (СТОПОВАНІ ТА НЕ ЗАСТАНОВАНІ)

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

3
Оцінений, оскільки це точно не так, як ви робите це у 2017 році - це було б docker volume/container/image prune, див. stackoverflow.com/a/39860665/3625317
Eugen Mayer

6
рекомендується протистояти протистояння, тому що: а) ця відповідь була з 2016 року; і б) багато людей не стикаються з кровотоком.
захоплюється

49

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

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

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

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


33

Якщо ви не любите видаляти всі контейнери, ви можете вибрати всі контейнери, створені до або після конкретного контейнера з docker ps --before <container-ID>або з docker ps --since <container-ID>. Ця функція принаймні є у версії Docker 0.6.5.

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

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

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

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

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

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

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


32

Оновлення: Станом на Докер версії 1.13 (випущена в січні 2017 року), ви можете видати таку команду для очищення зупинених контейнерів, невикористаних томів, звисаючих зображень та невикористаних мереж:

docker system prune

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

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

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

docker images -q --no-trunc -f dangling=true | xargs docker rmi

22

Ось мій 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 == "<none>" {print $'$1'}'
  docker images | tail -n +2 | awk '$1 == "<none>" {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

Джерело: https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup


@BradMurray Дякую! Можливо, вам також сподобаються такі: github.com/blueyed/dotfiles/commit/…
blueyed

3
Не працює на OSX через xargs --no-run-if-emptyопцію
caktux

13

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

Видаліть запущені контейнери

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

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

Примітка. Спроба зупинити контейнер призведе до помилки:

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

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

docker rm $(docker ps -a -q)

11

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

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

Я включу це у свою відповідь, оскільки це перша сторінка. Дякую
qkrijger

"з оболонки Windows" ? Ви маєте на увазі "використання оболонки Windows (CMD)" ?
Пітер Мортенсен

10

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

Докер прибирання

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

  • Контейнери, які не працювали більше одного дня тому
  • Зображення, які не належать до жодного іншого контейнера

Маю намір запустити роботу за допомогою crontab

Особливість

  • Це видалить усі <none>:<none>зображення
  • Якщо зображення має кілька посилань на теги repo: тег, воно видалить усі теги repo: за винятком запуску контейнера. Насправді це природа "docker rmi".
  • На екрані з’явиться багато повідомлень про помилки, і ви можете вирішити 2>/dev/nullчи ні
  • Дізнайтеся щось з docker-gc і виправте його проблему (він не може видалити зображення, яке містить mutliple repo: tag)

9

Тож особисто я рекомендую робити це як частину вашого сценарію розгортання як для зображень, так і для контейнерів, зберігаючи лише найсвіжіші n-контейнери та зображення. Я тегую свої зображення Docker за тією ж схемою версій, з якою я використовую git tag, а також завжди мічую останнє зображення 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's tail- ваш найкращий друг тут. Оскільки docker imagesі docker psобидва впорядковані за датою, ми можемо просто tailвибрати для вибору всіх, крім перших трьох, і видалити їх:

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)

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


8

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

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

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


Відредагуйте додаткові відомості. Відповіді, що містять лише коди, та "спробувати це" не рекомендують, оскільки вони не містять вмісту, який можна шукати, і не пояснюють, чому хтось повинен "спробувати це". Ми докладаємо зусиль, щоб бути ресурсом для знань.
Брайан Томпсетт - 汤 莱恩

У ubuntu 16.04 докер вимагає судо, тому потрібно писати sudo docker rm -f $(sudo docker ps -a -q).
Елліотт

як плюс, це також працює в Windows під Powerhell!
Роберт Іванц

@Elliott Я думаю sudo, що потрібен скрізь, якщо ви не додасте свого користувача до групи "docker". Я використовую ubuntu 16.10 без sudo, додавши свого користувача в групу докерів.
emory

7

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

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

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

docker ps -aq | wc -l

Приємна робота @Pithikos. Я додав відповідь, що видаляє всі старі контейнери.
Мостафа Гадімі

7

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

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

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

Видаліть усі немаєті зображення

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

sudo docker rmi $ (sudo docker images -q --filter "звисаючий = вірно")


Не забудьте видалити томи докера, вказавши параметр -v (sudo docker rm -v $ (sudo docker ps -a -q))
vcarel

Я не дивився на це, але я думаю, те саме, що:docker ps -aq | xargs docker rm -v
quine

Це працює лише в Linux, а не в Windows ... Але docker rm -f $(docker ps -a -q)працює в PowerShell / Docker для Windows.
Пітер Мортенсен

6

Новий спосіб: spotify / docker-gc відіграють трюк.

 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

Очищення об'ємів сиріт-контейнерів CLEAN_UP_VOLUMES = 1

Довідка: 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

очищення осіротілих докерних томів для docker версії 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

1
Цікава альтернатива. +1
VonC

6
  1. Видаліть усі докерські процеси:

    docker rm $(docker ps -a -q)
    
  2. Видаліть конкретний контейнер:

    $ docker ps -a (lists all old containers)
    
    $ docker rm container-Id
    


4
#!/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

для тих, хто не хоче їх шукати github.com/spotify/docker-gc
похмурий

Це прекрасно. Я також написав відповідь, яка має таку ж функціональність.
Мостафа Гадімі

3

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

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


Дякуємо, що додали інформацію про / var / lib / docker / graph
Jonathan DeMarks

Питання полягали в тому, як видалити контейнери, а не зображення.
pauk960

3

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

docker stop $(docker ps -a -q)

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

docker rm $(docker ps -a -q)


3

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

docker system prune -f

Це дивовижна порада!
b01

3

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

  1. Список усіх контейнерів

    docker ps -aq

  2. Зупиніть усі запущені контейнери

    docker stop $(docker ps -aq)

  3. Видаліть усі контейнери

    docker rm $(docker ps -aq)

  4. Видаліть усі зображення

    docker rmi $(docker images -q)

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


2

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

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

Якщо ви все одно виймаєте контейнери, то docker rm -f $(docker ps --no-trunc -aq)швидше
qkrijger

Щоправда, але якщо вам потрібно пройти належне відключення для очищення спільних або повторно використаних ресурсів (тобто приєднані томи, правильно закриті активні з'єднання тощо), вам потрібно зателефонувати зупинити спочатку. Чудовий приклад, якщо у вас є контейнер Дженкінса, то вбити контейнер - це погана ідея. Ви хочете, щоб він зберігав будь-які непідтримувані зміни, попереджав користувачів, які ввійшли в систему, і, що дуже важливо, належним чином зупинити всі складання.
Крайг МакКонагі

домовились, що це дуже дійсний випадок використання
qkrijger

2
#!/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 '^<none>' | awk '{print $3}')
if [[ -n $unused_images ]]
then
  docker rmi $unused_images
fi

5
Коли ви відповідаєте, краще мати деяке пояснення щодо того, що робить рішення, а не просто скидання коду, оскільки в іншому випадку відповідь може бути видалена.
AlBlue


2

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

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

видалити вийшли контейнери та:

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

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

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