Как удалить старые контейнеры Docker

1235

Этот вопрос связан с тем, должен ли я беспокоиться о лишних, не работающих Docker-контейнерах? ,

Мне интересно, как удалить старые контейнеры. docker rm 3e552code34aПозволяет удалить одну, но у меня есть много уже. docker rm --helpне дает возможность выбора (как все, или по имени изображения).

Может быть, есть каталог, в котором хранятся эти контейнеры, где я могу легко удалить их вручную?

qkrijger
источник
21
Вы также должны рассмотреть возможность очистки осиротевших томов докера. Я часто нахожу, что они занимают гораздо больше места, чем старые контейнеры и старые изображения. Хороший скрипт для удаления потерянных томов докера доступен по адресу: github.com/chadoe/docker-cleanup-volumes .
Неманя Трифунович
Может быть, github.com/chadoe/docker-cleanup-volumes может помочь вам.
Mihai8
Вы также можете использовать docker runс --rmфлагом, который сделает контейнер эфемерным, удалив все файлы контейнера после запуска.
Гордон
12
С докером 1.13 (4 квартал 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 контейнера Prune :

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 при построении образа из файла Docker вы можете указать -rmопцию удаления промежуточных контейнеров после успешной сборки.
Фрик Кальтер
3
@ MichelMüller изображения - это то, что используется для кэширования, поэтому удаление контейнеров не повлияет на это.
Кен Кокрейн
7
Если вы хотите использовать awk для этого, рассмотрите эту команду, если хотите сделать rm все остановленные контейнеры (без ошибки из-за первой строки):docker ps -a | awk 'NR > 1 {print $1}' | xargs docker rm
masi
3
Это должна быть обновленная команда для удаления непомеченных изображенийdocker rmi $(docker images -q -f dangling=true)
Ghjnut
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 (4 квартал 2016 г.), кредит VonC ( далее в этой теме ):

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

См. PR 26108 и commit 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
qkrijger
источник
11
у меня это почему-то не работает, но docker ps -a -q | xargs docker rmработает (может понадобиться sudo)
FUD
86
о чем docker rm $(docker ps -a -q)?
qkrijger
8
@qkrijger, это ничего не меняет в своем первоначальном ответе, за исключением добавления bashism. Проблема в переполнении командной строки. Вариант 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) не изменится. Бонусные баллы за порождение только одного дополнительного процесса вместо двух.
эвритмия
18
Вы можете добавить , -vчтобы избежать оборванных томов: docker rm -v $(docker ps -q -f status=exited). См. Docs.docker.com/userguide/dockervolumes/… для подробностей о висячих томах.
rluba
@rluba, по-видимому, в Docker 1.9 будет отдельный том API для решения этой проблемы. github.com/docker/docker/pull/14242
Райан Уоллс
псевдоним может быть полезным:alias docker-gc="docker rm -v \$(docker ps -q -f status=exited)"
Фрэнк Неблунг
В отличие от ответа, помеченного как правильный, ответ @RyanWalls работает в OSX, а также является более кратким.
Рэй
255

Официальный способ :

docker rm `docker ps -aq`

Сопровождающие Docker указали, что для этого не будет никаких команд - и вы составляете такие команды:

Мы обсуждали это раньше и предпочитаем, чтобы пользователи использовали приведенную выше строку без добавления дополнительного кода в Docker.

Майкл Нил
источник
6
Это плохое решение, потому что оно также удалит контейнеры хранения.
Sobrique
8
Что вы имеете в виду "контейнеры для хранения"? Если вы имеете в виду контейнеры только для данных, которые когда-то использовались для хранения ссылок на тома данных, они больше не нужны из-за доступности docker volumeподкоманды и именованных томов.
L0j1k
Обратите внимание, что это не будет работать в Windows Powershell. Для этого это лучшее решение: stackoverflow.com/a/23674294/1150683
Брэм Ванрой
@Sobrique Если вы не реагируете, по крайней мере, вы должны удалить свой комментарий, это почти полная и вредная ерунда.
Петер - Восстановить Монику
128

С Docker 1.13 (4 квартал 2016 года) у вас теперь есть:

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

docker system pruneбез -a удалит (для изображений) только оборванных изображения или изображения без тега, так как заметил по smilebomb .

См. PR 26108 и commit 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
VonC
источник
Спасибо, что поделились - для того, чтобы это стало видно, я цитирую вас в ответ высоко в теме
qkrijger
Как обычно, добавьте -fфлаг, чтобы принудительно выполнить очистку без вопросов.
Дирк
3
следует пометить в качестве правильного на сегодняшний день ответа, большинство из вышеперечисленных были верны вовремя, но сегодня они слишком сложны
Евгений Майер
Договорились, так намного легче в последнее время, до вы идете!
Максим
Описание в блоке кода предназначено для 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фильтрации.

caktux
источник
2
Обратите внимание на реальную пользу этого - вы случайно не убиваете storageконатинеров.
Sobrique
3
Вы также можете использовать, status=createdчтобы получить те, которые не работают и никогда не запускались.
enderland
96

ОБНОВЛЕНО 2019 (НОВИНКА)

docker container prune

Это - 2017 (старый) способ

Удалить ВСЕ ОСТАНОВЛЕННЫЕ КОНТЕЙНЕРЫ

docker rm $(docker ps -a -q)

Чтобы удалить ВСЕ КОНТЕЙНЕРЫ (ОСТАНОВЛЕННЫЕ И НЕ ОСТАНОВЛЕННЫЕ)

docker rm  -f $(docker ps -a -q)
Levi
источник
3
недооценено, так как это точно не так, как вы делаете это в 2017 году - как это было бы docker volume/container/image prune, см. stackoverflow.com/a/39860665/3625317
Евгений Майер
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.

Montells
источник
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. Я думаю, что дополнительные контейнеры не наносят никакого другого вреда, но занимают место на диске.

vesako
источник
32

Обновление. Начиная с версии Docker 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
L0j1k
источник
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

blueyed
источник
@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)
Ulises
источник
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)
HardySimpson
источник
9

Итак, лично я рекомендую сделать это как часть вашего сценария развертывания для образов и контейнеров, сохраняя только самые последние n контейнеров и изображений. Я помечаю свои образы Docker с помощью той же схемы управления версиями, с которой я использую, git tagа также всегда отмечаю последний образ Docker как «последний». Это означает, что без очистки чего-либо мои изображения 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)

Опять же, та же идея применима и к контейнерам, но вы получите ее к этому моменту, поэтому я перестану приводить примеры.

Eli
источник
8

Использование:

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

Он принудительно останавливает и удаляет все контейнеры, присутствующие на месте.

Шашанк Г
источник
Пожалуйста, отредактируйте с дополнительной информацией. Ответы «только код» и «попробуй это» не приветствуются, потому что они не содержат контента для поиска и не объясняют, почему кто-то должен «попробовать это». Мы прилагаем все усилия, чтобы быть источником знаний.
Брайан Томпсетт - 莱恩 莱恩
В Ubuntu 16.04 для докера требуется sudo, поэтому вы должны написать sudo docker rm -f $(sudo docker ps -a -q).
Эллиотт
как плюс, это также работает в Windows под PowerShell!
Роберт Иванк
@ Эллиотт Я думаю, что sudoтребуется везде, если вы не добавите своего пользователя в группу «Докер». Я использую Ubuntu 16.10 без sudo, добавив моего пользователя в группу Docker.
Эмори
7

Удалить 5 самых старых контейнеров:

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

Посмотрите, сколько контейнеров осталось:

docker ps -aq | wc -l
Pithikos
источник
Хорошая работа @Pithikos. Я добавил ответ, который удаляет все старые контейнеры.
Мостафа Гадими
7

Удалить все остановленные контейнеры.

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

Это удалит все остановленные контейнеры, получив список всех контейнеров с помощью docker ps -a -q и передав их идентификаторы в docker rm. Это не должно удалять любые запущенные контейнеры, и это скажет вам, что не может удалить запущенный образ.

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

Теперь вы хотите очистить старые изображения, чтобы сэкономить место.

sudo docker rmi $ (изображения sudo docker -q --filter "dangling = true")

Ric_Harvey
источник
Не забудьте удалить тома докера, указав опцию -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

 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
е-общество
источник
1
Интересная альтернатива. +1
VonC
6
  1. Удалить все процессы докера:

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

    $ docker ps -a (lists all old containers)
    
    $ docker rm container-Id
    
padakpadak
источник
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
mckoss
источник
для тех, кто не хочет искать его самостоятельно github.com/spotify/docker-gc
мрачный
Идеально. Я также написал ответ, который имеет такую ​​же функциональность.
Мостафа Гадими
3

Я всегда использую, docker rmi $(docker ps -a -q)чтобы удалить все изображения.

Вы можете удалить каталог /var/lib/docker/graphпри docker rmiнеудаче.

Солнечный
источник
Спасибо за добавление / var / lib / docker / graph info
Джонатан Демаркс
Вопрос был в том, как удалить контейнеры, а не изображения.
pauk960
3

Вы можете удалить только остановленные контейнеры. Останови их всех в начале

docker stop $(docker ps -a -q)

Тогда вы можете удалить

docker rm $(docker ps -a -q)

Марчин Шимчак
источник
3

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

docker system prune -f
собутыльник
источник
Это удивительный pro-tip!
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 и превратил его в clear all (остановите и удалите все)

docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`
Крейг МакКонахи
источник
Если вы все равно docker rm -f $(docker ps --no-trunc -aq)
удаляете
Верно, но если вам необходимо выполнить корректное завершение работы для очистки общих или повторно используемых ресурсов (т. Е. Подключенных томов, правильно закрытых активных соединений и т. Д.), Сначала необходимо вызвать stop. Отличный пример, если у вас есть контейнер Jenkins, то убить контейнер - плохая идея. Вы хотите, чтобы он сохранял любые незарегистрированные изменения, предупреждал зарегистрированных пользователей и, что очень важно, правильно останавливал все сборки.
Крейг МакКонахи
согласился, это очень
верный вариант
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
AleX
источник
5
Когда вы отвечаете, лучше иметь некоторое объяснение того, что делает решение, а не просто дамп кода, иначе ответ может быть удален.
AlBlue
2

Я использую:

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

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

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

чтобы избавиться от всех непомеченных изображений.

Александру Бантюк
источник