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

Этот вопрос связан с Должен ли я беспокоиться о избыточных, неработающих контейнерах Docker?.

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

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

Ответы

Ответ 1

Начиная с 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.

Ответ 2

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

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

удалит все контейнеры элегантным способом.

И Bartosz Bilicki, для 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

Ответ 3

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

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

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

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

Ответ 4

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

docker rm `docker ps -aq`

Поддерживатели Docker указали, что для этого не будет никакой команды, и вы создадите такие команды:

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

Ответ 5

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

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

docker system prune удаления из 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

Ответ 6

Теперь можно использовать filtering с docker ps:

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

И для images:

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

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

Здесь более чистый script для добавления в ~/.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.

Ответ 7

ОБНОВЛЕНО 2017 (NEWEST)

docker container prune

Это - 2017 (OLD) способ

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

docker rm $(docker ps -a -q)

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

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

Ответ 8

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

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 для этого.

Ответ 9

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

Ответ 10

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

Ответ 11

Вот мой скрипт 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 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 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

Ответ 12

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

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

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

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

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

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

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

docker rm $(docker ps -a -q)

Ответ 13

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

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

Ответ 14

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

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

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

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

Собираются работать как crontab

Особенность

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

Ответ 15

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

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

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

Ответ 16

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

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

Ответ 17

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

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

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

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

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

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

Ответ 18

  • Удалите все процессы докеров:

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

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

Ответ 19

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

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

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

docker ps -aq | wc -l

Ответ 20

Новый способ: 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

Ответ 21

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

Ответ 23

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

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

Ответ 24

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

docker stop $(docker ps -a -q)

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

docker rm $(docker ps -a -q)

Ответ 25

Основные шаги, чтобы остановить/удалить все контейнеры и изображения

  1. Перечислите все контейнеры

    docker ps -aq

  2. Остановите все работающие контейнеры

    docker stop $(docker ps -aq)

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

    docker rm $(docker ps -aq)

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

    docker rmi $(docker images -q)

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

Ответ 26

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

docker system prune -f

Ответ 27

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

docker rm  $(docker ps -a | awk '/myimage:mytag/{print $1}')

Ответ 28

В Ubuntu 14.04 (Trusty Tahr):

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

Это обычная команда Bash, поэтому она должна работать с КАЖДОМ Bash -компьютерным терминалом.

Ответ 29

Чтобы удалить ВСЕ контейнеры:

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

Объяснение:

sudo docker ps -a

Возвращает список контейнеров.

awk '{print $1}'

Получает первый столбец, который является идентификатором контейнера.

grep -v CONTAINER

Удалить заголовок.

Последний канал отправляет идентификаторы в sudo docker rm -f безопасно.

Ответ 30

Для всех, кого это интересует, я взял пример из qkrijger и превратил его в ясное все (остановите и удалите все)

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