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

Этот вопрос связан с https://stackoverflow.com/questions/17014263/should-i-be-concerned-about-excess-non-running-docker-containers.

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

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

Комментарии к вопросу (8)
Решение

Поскольку Docker 1.13.x вы можете использовать Docker контейнерный чернослив:

docker container prune

Это удалит все остановленные контейнеры и должно работать на всех платформах одинаково.

Существует также Docker system prune:

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.

Комментарии (21)

Другой метод, который я получил от Гийома Ж. Шармеса (кредит, где он должен):

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 и 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
Комментарии (20)

Обновленный ответ Используйте docker system prune или docker container prune прямо сейчас. См. Обновленный ответ VonC.

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

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

  • -q печатает только идентификаторы контейнера (без заголовков столбцов)
  • -f позволяет фильтровать ваш список печатных контейнеров (в этом случае мы фильтруем только отображение выведенных контейнеров)
Комментарии (7)

Официальный путь это:

docker rm `docker ps -aq`

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

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

Комментарии (4)

С Docker 1.13 (Q4 2016) у вас теперь есть:

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

docker system prune без -a удалит (для изображений) только висящие изображения или изображения без тега, как [комментировано][2] 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, который может использоваться для удаления неиспользуемых экземпляров всего одного типа объекта.

Введен в commit 913e5cb, только для Docker 1.13+.

docker container prune

[2]: https://stackoverflow.com/questions/17236796/how-to-remove-old-docker-containers/39860665?noredirect = 1 # comment89860875_39860665

Комментарии (8)

Теперь можно использовать фильтр с 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)

ОБНОВЛЕНО 2019 (НОВЫЙ)

docker container prune

Это - 2017 (ЛОД) путь

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

docker rm $(docker ps -a -q)

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

docker rm  -f $(docker ps -a -q)
Комментарии (2)

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

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.

Комментарии (0)

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

Комментарии (0)

Обновление: Начиная с версии Docker 1.13 (выпущенной в январе 2017 года), вы можете выполнить следующую команду для очистки остановленных контейнеров, неиспользованных объемов, висящих изображений и неиспользуемых сетей:

docker system prune

Если вы хотите убедиться, что вы удаляете только те контейнеры, которые имеют статус «вышел», используйте это:

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

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

docker images -q --no-trunc -f dangling=true | xargs docker rmi
Комментарии (0)

Вот мой сценарий 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

Источник: https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup

Комментарии (2)

Сначала прекратите работу контейнеров, прежде чем пытаться их удалить

Удалить работающие контейнеры

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

Вы можете использовать kill вместо stop. В моем случае я предпочитаю «стоп», так как я склонен перезапускать их против. каждый раз создаю новый, поэтому я стараюсь их красиво закрыть.

Примечание: Попытка остановить контейнер приведет к ошибке:

Ошибка: невозможно удалить работающий контейнер, пожалуйста, остановите его первым

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

docker rm $(docker ps -a -q)
Комментарии (0)

Удаление всех контейнеров из оболочки Windows:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
Комментарии (2)

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

Очистка докеров

Крошечная универсальная оболочка, которая удаляет:

  • Контейнеры, которые не работают более одного дня назад
  • Изображения, которые не принадлежат ни одному оставшемуся контейнеру

Намереваться работать как работа

Характеристика

  • Он удалит все изображения < none >: < none >
  • Если изображение имеет несколько ссылок repo: tag, оно удалит все repo: tag, кроме как при запуске контейнера. На самом деле это природа "докера РМИ".
  • Многие сообщения об ошибке будут отображаться на экране, и вы можете решить 2 > / dev / null или нет
  • Изучите что-нибудь из docker-gc и исправьте его проблему (он не может удалить изображение с черепичной репо: тег)
Комментарии (0)

Использовать:

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

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

Комментарии (4)

Снять все остановленные контейнеры.

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

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

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

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

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

Комментарии (3)

Поэтому лично я рекомендую сделать это как часть вашего сценария развертывания для изображений и контейнеров, сохраняя только самые последние 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 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)

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

Комментарии (0)
  1. Удалить все процессы докера:

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

     $ docker ps -a (перечисляет все старые контейнеры)
    
     $ docker rm container-Id
Комментарии (0)

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

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

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

docker ps -aq | wc -l
Комментарии (1)

Новый путь: 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

очистка осиротевших докеров для докеров версии 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)