как очистить каталог наложения докеров?

Я запускаю докер через 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

  • --quiet

  • --all

  • Статус --filter = выведен


docker rm

  • --force

Изображение 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


Ответ 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