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

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

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

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

30 ответов


есть новая функция в настройки 1.13.x под названием Docker контейнер чернослив: docker container prune

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

также Docker system prune: docker system prune, который очистит контейнеры, изображения, Тома и сети все в одной команде.

Оригинальный Ответ:

были некоторые разговоры о Docker cleanup команда. Вы можете найти информацию по этому билету: реализовать "чистую" команду (#928)

пока эта команда не доступна, вы можете строковые команды Docker вместе с другими командами Unix, чтобы получить то, что вам нужно. Вот пример того, как очистить старые контейнеры, которым несколько недель:

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

чтобы отдать должное, где это необходимо, этот пример из https://twitter.com/jpetazzo/status/347431091415703552.


другой метод, который я получил от Guillaume J. Charmes (кредит, где он должен):

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 daemon занимает на диске и позволяет легко очистить "ненужный" избыток.

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

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

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

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

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

официальный способ - это:

docker rm `docker ps -aq`

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

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


с Докером 1.13 (Q4 2016), теперь у вас есть:

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

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

посмотреть PR 26108 и совершить 86de7c0, которые вводят несколько новых команд, чтобы помочь облегчить визуализацию того, сколько места данные docker daemon занимает на диске и позволяет легко очистить "ненужный" избыток.

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

As wjv комментарии

есть еще docker {container,image,volume,network} prune, который может быть использован для удаления неиспользуемых экземпляров просто один тип объекта.

представил в совершить 913e5cb, только для Docker 1.13+.

docker container prune

теперь можно использовать фильтрация С 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 [ "" == "--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
}

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


обновлено 2017 (новое)

docker container prune

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

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

docker rm $(docker ps -a -q)

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

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

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

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

из комментарий pauk960:

начиная с версии 1.3.0 вы можете использовать фильтры с docker ps, вместо grep Exited использовать docker ps -a -f status=exited. И если вы используете -q С ним вы можете получить идентификаторы контейнеров только вместо полного вывода, для этого не нужно использовать awk.


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


обновление: начиная с версии 1.13 Docker (выпущенной в январе 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

вот мой 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:  is used with awk's print: 0=line, 1=column 1.
  docker ps -a | awk ' ~ "[0-9a-f]{12}" {print $''}'
}

untagged_images() {
  # Print untagged images:  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 ' == "<none>" {print $''}'
  docker images | tail -n +2 | awk ' == "<none>" {print $''}'
}

# Dry-run.
if [ "" = "-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


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

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

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

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

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

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

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

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

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

docker rm $(docker ps -a -q)

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

Docker cleanup

крошечная оболочка "все-в-одном", которая удаляет:

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

намерены работать как задание crontab

характеристика

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

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

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

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


поэтому лично я рекомендую сделать это как часть вашего сценария развертывания для изображений и контейнеров, сохраняя только самые последние N контейнеров и изображений. Я помечаю свои изображения Docker той же схемой управления версиями, которую я использую с git tag а также всегда помечая последнее изображение Docker с помощью " latest."Это означает, что, не убирая ничего, мои изображения Докера выглядят так:

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 для откатов и избавиться от всего остального. ваш лучший друг здесь. С 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 }' | tail -n +4)

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


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

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

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

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

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

sudo docker RMI $(sudo docker images-q --фильтр "болтается=true")


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

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

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

docker ps -aq | wc -l

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

очистка потерянных томов docker для docker версии 1.10.X и выше

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

на основе периода времени

 docker ps -a | grep "weeks ago" | awk "{print }" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "days ago" | awk "{print }" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "hours ago" | awk "{print }" | xargs --no-run-if-empty docker rm

  1. удалить все процессы docker:

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

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

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

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

вот полная суть, чтобы также удалить старые изображения на docker:Gist для удаления старых контейнеров Docker и изображений.


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

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

    docker ps -aq

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

    docker stop $(docker ps -aq)

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

    docker rm $(docker ps -aq)

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

    docker rmi $(docker images -q)

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


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

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

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


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

docker stop $(docker ps -a -q)

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

docker rm $(docker ps -a -q)


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

docker system prune -f

чтобы удалить все контейнеры без крика:

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

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

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

docker rm --force `docker ps -qa`

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

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