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





15 Answers

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

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
image сохранить изменения

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

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

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




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

docker rm `docker ps -aq`

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

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




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




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

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

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

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




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



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

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

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

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

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

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

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

docker rm $(docker ps -a -q)



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

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

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

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

Предназначен для работы в качестве работы crontab

Особенность

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



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

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




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

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

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

docker ps -aq | wc -l



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

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

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



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

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

    docker ps -aq

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

    docker stop $(docker ps -aq)

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

    docker rm $(docker ps -aq)

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

    docker rmi $(docker images -q)

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




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

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




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

docker system prune -f



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

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



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

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



Related


Tags

docker