как очистить каталог наложения докеров?
Я запускаю докер через CoreOS и AWS ECS. У меня появилось поврежденное изображение, которое многократно перезапускалось, а контейнеры все еще around- заполняли мой раздел диска. В частности, /var/lib/docker/overlay/
содержит большое количество файлов/каталогов.
Я знаю, что тома-очистка-тома - вещь, но она очищает каталог /volume, а не каталог /overlay.
docker ps -a
показывает более 250 попыток запуска на моем плохом контейнере докера. Однако они не работают.
Помимо rm -rf/var/lib/docker/overlay/*
, как я/должен его очистить?
Ответы
Ответ 1
С нашей стороны мы использовали:
sudo docker system prune -a -f
Который спасет меня 3Go!
Мы используем также известные команды:
sudo docker rm -v $(sudo docker ps -a -q -f status=exited)
sudo docker rmi -f $(sudo docker images -f "dangling=true" -q)
docker volume ls -qf dangling=true | xargs -r docker volume rm
Мы поставили это на cron, чтобы немного улучшить наше дисковое пространство.
ура
Ссылка: https://forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604/4
Ответ 2
Вот хакерский способ, который я делаю прямо сейчас. Я не собираюсь принимать это как ответ, потому что я надеюсь, что там лучший способ.
# delete old docker processes
docker rm 'docker ps -a | grep Exited | awk '{print $1 }''
ignore_errors: true
# delete old images. will complain about still-in-use images.
docker rmi 'docker images -aq'
Ответ 3
Я добавил это в bashrc в своей среде разработки и привык запускать его каждый день или около того.
function cleanup_docker() {
docker ps -f status=exited -q | xargs -r docker rm
docker images -f dangling=true -q | xargs -r docker rmi
}
В некоторых случаях следующий скрипт может освободить больше места, так как он попытается удалить все изображения и просто потерпит неудачу:
function cleanup_docker_aggressive() {
for i in $(docker images --no-trunc -q | sort -u)
do
docker rmi $i 2> /dev/null
done
}
К сожалению, они не намного чище, чем ваше решение.
РЕДАКТИРОВАТЬ: Начиная с Docker 1.13, вы можете использовать систему Docker:
docker system df # to check what is using space
docker system prune # cleans up also networks, build cache, etc
РЕДАКТИРОВАТЬ: Начиная с Docker 2017.09, вы также можете использовать контейнер и изображение
docker container prune
docker image prune -a
последний вы можете использовать с необычными фильтрами, такими как --filter "until=24h"
Ответ 4
Мы только начали эту проблему, и ответ btafarelo дал мне часть пути, или, по крайней мере, заставило меня почувствовать себя лучше об удалении записей sha256.
Системная информация: экземпляры ec2, работающие с CoreOS 1.12 позади ELB
- Слейте экземпляр докера из ELB
-
Отключить докер
systemctl stop docker
rm -rf /var/lib/docker/overlay/*
-
Выполнение результатов команд
for d in $(find /var/lib/docker/image/overlay -type d -name '*sha256*'); do echo rm -rf $d/* ; done
-
перезагрузка (самый простой способ вернуть все)
Это восстановило около 25% диска после перезапуска служб без каких-либо побочных эффектов.
Ответ 5
docker ps
docker rm
Изображение docker
- --quiet
- --all
- --filter dangling = true
docker rmi
Ваш хакерский путь в порядке.
docker rm 'docker ps -a | grep Exited | awk '{print $1 }''
Мой хакерский путь
docker rm $(docker ps --all | awk '/ago/{print $1}')
Немного более чистый способ - запустить docker ps
с --quiet
(-q), чтобы получить только номер идентификатора, а --filter status=exited
выйти на --filter только на выходе.
docker rm $(docker ps --filter status=exited --quiet) # remove stopped docker processes
или запустить docker rm
с --force
(-f) и docker ps
с --all
(-a), чтобы выключить даже запущенные
docker rm --force $(docker ps --all --quiet) # remove all docker processes
Что, возможно, занимает все это место на диске после нескольких неудачных сборок - это изображения. Чтобы сохранить дисковое пространство на хосте docker, периодически удаляйте неиспользуемые файлы докеров с помощью
docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images
или чтобы получить более агрессивный характер, вы можете --force
(-f) очистить изображения --all
(-a)
docker rmi --force $(docker images --all --quiet) # clean all possible docker images
Метод @analytik поместить его в функцию .bashrc кажется практической идеей
function cleanup_docker() {
docker rm --force $(docker ps --all --quiet) # remove all docker processes
docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images
}
и если у вас есть привычка генерировать много изображений докеров, которые вам не нужны, добавьте их в .bash_logout
Ответ 6
Сбор мусора Docker может быть выполнен простым способом с использованием другого контейнера докера https://github.com/spotify/docker-gc
Вы можете запустить его как cron, используя https://github.com/flaccid/docker-docker-gc-crond
Ответ 7
БУДЬТЕ ОСТОРОЖНЫ, это решение, кажется, удаляет другие важные вещи.
Вам нужно проверить ваши изображения/контейнеры и удалить папки в /opt/docker/overlay, которые не были найдены при выполнении проверки
docker inspect $(docker ps -qa) | grep -oE '[a-f0-9]{64}' >> inspect-hashs.txt
docker inspect $(docker images -qa) | grep -oE '[a-f0-9]{64}' >> inspect-hashs.txt
sudo ls -l /var/lib/docker/overlay > overlays.txt
diff -u inspect-hashs.txt overlays.txt | grep -E '^\+' | grep -oE '[a-f0-9]{64}' | xargs sudo rm -rf /opt/docker/overlay/
Ответ 8
здесь разрешено очищать каталог наложения докеров с https://lebkowski.name/docker-volumes/
docker images --no-trunc | grep '<none>' | awk '{ print $3 }' | xargs -r docker rmi
docker ps --filter status=dead --filter status=exited -aq | xargs docker rm -v
для Docker <1,9:
find '/var/lib/docker/volumes/' -mindepth 1 -maxdepth 1 -type d | grep -vFf <(docker ps -aq | xargs docker inspect | jq -r '.[]|.Mounts|.[]|.Name|select(.)')
Или для Докера> = 1,9:
docker volume ls -qf dangling=true | xargs -r docker volume rm