Этот вопрос связан с https://stackoverflow.com/questions/17014263/should-i-be-concerned-about-excess-non-running-docker-containers.
Мне интересно, как удалить старые контейнеры. Docker rm 3e552code34a
позволяет удалить один, но у меня уже есть много. docker rm --help
не дает опцию выбора (как все, или по имени изображения).
Возможно, есть каталог, в котором хранятся эти контейнеры, где я могу легко удалить их вручную?
Поскольку 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.
Другой метод, который я получил от Гийома Ж. Шармеса (кредит, где он должен):
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
Обновленный ответ
Используйте docker system prune
или docker container prune
прямо сейчас. См. Обновленный ответ VonC.
Предыдущий ответ Составляя несколько различных советов выше, самый элегантный способ удалить все неработающие контейнеры, кажется:
docker rm $ (docker ps -q -f status = exited)
-q
печатает только идентификаторы контейнера (без заголовков столбцов)-f
позволяет фильтровать ваш список печатных контейнеров (в этом случае мы фильтруем только отображение выведенных контейнеров)Официальный путь это:
docker rm `docker ps -aq`
Сопровождающие Docker указали, что для этого не будет команды - и вы составляете команды следующим образом:
Мы обсуждали это раньше и предпочитаем, чтобы пользователи использовали приведенную выше строку без добавления дополнительного кода в Docker.
С 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
Теперь можно использовать фильтр с 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
.*ОБНОВЛЕНО 2019 (НОВЫЙ)
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 $1}')
Из комментария pauk960:
Начиная с версии 1.3.0 вы можете использовать фильтры с
docker ps
, вместоgrep Exited
использоватьdocker ps -a -f status = exited
. И если вы используете-q
с ним, вы можете получить только идентификаторы контейнеров вместо полного вывода, для этого не нужно использовать awk.
Если вы не хотите удалять все контейнеры, вы можете выбрать все контейнеры, созданные до или после определенного контейнера с 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. Я думаю, что дополнительные контейнеры не причиняют другого вреда, но занимают место на диске.
Обновление: Начиная с версии 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
Вот мой сценарий 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 == "<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
Сначала прекратите работу контейнеров, прежде чем пытаться их удалить
docker rm $(docker stop -t=1 $(docker ps -q))
Вы можете использовать kill
вместо stop
. В моем случае я предпочитаю «стоп», так как я склонен перезапускать их против. каждый раз создаю новый, поэтому я стараюсь их красиво закрыть.
Примечание: Попытка остановить контейнер приведет к ошибке:
Ошибка: невозможно удалить работающий контейнер, пожалуйста, остановите его первым
docker rm $(docker ps -a -q)
Удаление всех контейнеров из оболочки Windows:
FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
https://github.com/HardySimpson/docker-cleanup
Крошечная универсальная оболочка, которая удаляет:
Намереваться работать как работа
< none >: < none >
2 > / dev / null
или нетИспользовать:
docker rm -f $(docker ps -a -q)
Он принудительно останавливает и удаляет все контейнеры, присутствующие на месте.
Снять все остановленные контейнеры.
sudo docker rm $ (sudo docker ps -a -q)
Это удалит все остановленные контейнеры, получив список всех контейнеров с docker ps -a -q и передав их идентификаторы в docker rm. Это не должно удалять бегущие контейнеры, и это скажет вам, что не может удалить бегущее изображение.
Удалить все нецелевые изображения
Теперь вы хотите очистить старые изображения, чтобы сэкономить место.
sudo docker rmi $ (изображения sudo docker -q --filter "dangling = true")
Поэтому лично я рекомендую сделать это как часть вашего сценария развертывания для изображений и контейнеров, сохраняя только самые последние 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)
Опять же, та же идея применима к контейнерам, но вы получите ее к этому моменту, поэтому я перестану приводить примеры.
Удалить все процессы докера:
докер rm $ (докер ps -a -q)
Удалить конкретный контейнер:
$ docker ps -a (перечисляет все старые контейнеры)
$ docker rm container-Id
Новый путь: 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