Как удалить старые контейнеры 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
Ответ 22
Вы можете использовать следующую команду для удаления выведенных контейнеров:
docker rm $(sudo docker ps -a | grep Exit | cut -d ' ' -f 1)
Вот полный смысл удалить старые изображения на докере: Gist для удаления старых контейнеров и изображений Docker.
Ответ 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
Основные шаги, чтобы остановить/удалить все контейнеры и изображения
-
Перечислите все контейнеры
docker ps -aq
-
Остановите все работающие контейнеры
docker stop $(docker ps -aq)
-
Удалить все контейнеры
docker rm $(docker ps -aq)
-
Удалить все изображения
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`