Ошибка Docker: на устройстве не осталось места

112

Я установил docker на машину Debian 7 следующим образом

echo deb http://get.docker.io/ubuntu docker main >

/etc/apt/sources.list.d/docker.list

Обновление sudo apt-get curl -sSL https://get.docker.com/ubuntu/ | sudo sh

После этого, когда я впервые попытался создать изображение, он потерпел неудачу со следующей ошибкой

 time="2015-06-02T14:26:37-04:00" level=info msg="[8] System error: write /sys/fs/cgroup/docker/01f5670fbee1f6687f58f3a943b1e1bdaec2630197fa4da1b19cc3db7e3d3883/cgroup.procs: no space left on device"

Вот информация о докере

Containers: 2
Images: 21
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 25
Dirperm1 Supported: true
Execution Driver: native-0.2
Kernel Version: 3.16.0-0.bpo.4-amd64
Operating System: Debian GNU/Linux 7 (wheezy)
CPUs: 2
 Total Memory: 15.7 GiB


WARNING: No memory limit support
 WARNING: No swap limit support

Как увеличить память? Где хранятся системные конфигурации?

Из предложений Kal:

Когда я избавился от всех изображений и контейнеров, он освободил некоторое пространство, а сборка изображений продолжилась до сбоя с той же ошибкой. Итак, вопрос в том, какое пространство относится к этому и как его настроить?

  • 0
    Иногда вы можете установить ограничение по размеру для каждого контейнера , в зависимости от серверной части хранилища. Эта ссылка показывает, как это исправить для устройства устройства.
  • 3
    У меня была эта ошибка, когда на моем диске не было inode. Проверьте df -ih
Показать ещё 1 комментарий
Теги:
docker
memory
temp

10 ответов

129

У меня была такая же ошибка и решить ее так:

1. Удалите потерянные тома в Docker, вы можете использовать встроенную команду тонера. Встроенная команда также удаляет любую директорию в/var/lib/docker/томах, которая не является томом, поэтому убедитесь, что вы не поместили ничего там, которое вы хотите сохранить.

Предупреждение будьте очень осторожны с этим, если у вас есть данные, которые вы хотите сохранить

Очистка:

$ docker volume rm $(docker volume ls -qf dangling=true)

Дополнительные команды:

Список оборванных томов:

$ docker volume ls -qf dangling=true

Список всех томов:

$ docker volume ls

2. Также рассмотрите удаление всех неиспользуемых изображений.

Сначала избавьтесь от изображений <none> (они иногда генерируются при создании изображения, и если по какой-либо причине здание изображения было прервано, они остаются там).

вот хороший script я использую для их удаления

docker rmi $(docker images | grep '^<none>' | awk '{print $3}')

Затем, если вы используете Docker Compose для создания изображений локально для каждого проекта. В итоге вы получите много изображений, обычно называемых вашей папкой (например, если ваша папка проекта с именем Hello, вы найдете имя изображения Hello_blablabla). поэтому также рассмотрите возможность удаления всех этих изображений

вы можете редактировать приведенные выше script, чтобы удалить их или удалить их вручную с помощью

docker rmi {image-name}

  • 18
    Просто примечание: команды awk на Mac должны быть заключены в одинарные кавычки, а не в двойные, в противном случае они просто игнорируются.
  • 2
    Я на MAC, и он работает на меня! но спасибо за совет.
Показать ещё 8 комментариев
56

Убедитесь, что у вас есть свободное место в /var, так как Docker сохраняет файлы изображений по умолчанию (в/var/lib/docker).

Сначала очистите содержимое, используя docker ps -a, чтобы перечислить все контейнеры (включая остановленные) и docker rm, чтобы удалить их; затем используйте docker images, чтобы перечислить все сохраненные вами изображения и docker rmi, чтобы удалить их.

Затем измените место хранения с помощью опции -g на демере докеров или отредактировав /etc/default/docker и добавив параметр -g в DOCKER_OPTS. -g указывает местоположение "Время выполнения Docker", которое в основном является всем, что создает Docker при создании изображений и запусках контейнеров. Выберите место с большим количеством места, поскольку используемое дисковое пространство будет со временем расти. Если вы отредактируете /etc/default/docker, вам нужно будет перезапустить демона докеров, чтобы изменения вступили в силу.

Теперь вы сможете создать новое изображение (или вытащить его из Docker Hub), и вы увидите, что в каталоге, указанном с параметром -g, создается куча файлов.

  • 0
    Спасибо, Кэл, я не смог найти документацию по DOCKER_OPTS. Что означает опция -g и для чего она должна быть установлена? Также можно удалить содержимое под docker / aufs / mnt?
  • 0
    Эй, Рубин, я не думаю, что когда-либо нашел настоящий документ о DOCKER_OPTS, но есть места в документации, где говорится о редактировании. Самое близкое, что я могу найти, находится в конце docs.docker.com/installation/ubuntulinux/…, где говорится о редактировании настроек DNS в DOCKER_OPTS. Параметры в DOCKER_OPTS просто передаются демону, поэтому ссылка на них - docs.docker.com/reference/commandline/cli/#daemon . -g устанавливает базовое местоположение «среды выполнения Docker»
Показать ещё 7 комментариев
38

UPDATE
Нижеприведенные команды стали взломать, поскольку Docker становится более развитым. Текущая лучшая практика -

docker system prune

Это приведет к удалению:

- all stopped containers
- all volumes not used by at least one container
- all networks not used by at least one container
- all dangling images

Как показано ниже, это ядерное.


Чтобы очистить систему, сначала удалите контейнеры

$ docker rm $(docker ps -aq)

затем удалите изображения

$ docker rmi $(docker images -q)

Это, конечно, ядерное и удалит все контейнеры и все изображения. Вы можете удалить их по одному с помощью docker rm #CONTAINER_ID# и docker rmi #IMAGE_ID.

  • 2
    как указал Кевин Смит, эта ошибка, вероятно, связана с тем, что у вас закончились inode, которые вы можете увидеть с помощью df -ih . Для более ncdu диагностики введите ncdu затем нажмите c для подсчета файлов и C для сортировки по количеству файлов, чтобы получить приблизительную оценку того, что использует все ваши inode. Если проблема действительно в докере, это будет сразу видно по каталогам, использующим наибольшее количество инодов.
  • 0
    у меня "докер системный чернослив" работал.
Показать ещё 2 комментария
25

Если это просто тестовая установка Docker (т.е. не производство), и вам не нужно делать ядерную очистку, вы можете:

очистить все контейнеры: docker ps -a | sed '1 d' | awk '{print $1}' | xargs -L1 docker rm

очистить все изображения: docker images -a | sed '1 d' | awk '{print $3}' | xargs -L1 docker rmi -f

Опять же, я использую это в своих экземплярах ec2 при разработке Docker, а не в любом серьезном QA или пути производства. Самое замечательное в том, что если у вас есть Dockerfile (ы), его легко перестроить и docker pull.

  • 1
    В моем экземпляре boot2docker мне пришлось вызывать docker images -a | sed '1 d' | awk '{print $3}' | xargs docker rmi -f . Версия xargs OS X BSD поддерживает опцию -L , в отличие от версии boot2docker.
  • 1
    Вы можете использовать docker ps -a -q и т. Д., Чтобы избежать манипуляций с текстом, т.е. docker rm $(docker ps -a -q); docker rmi -f $(docker images -a -q) должен сделать свое дело
5

удалить сразу все неиспользуемые контейнеры, тома, сети и изображения (https://docs.docker.com/engine/reference/commandline/system_prune/#related-commands):

docker system prune -a -f

если этого недостаточно, можно сначала удалить запущенные контейнеры:

docker rm -f $(docker ps -a -q)
docker system prune -a -f

увеличение/var/lib/docker или использование другого места с большим пространством также является хорошей альтернативой для избавления от этой ошибки (см. Как изменить каталог установки образа docker?)

  • 0
    docker system prune не удаляет тома.
  • 1
    docker system prune -a -f --volumes удаления docker system prune -a -f --volumes удалит тома.
4

В ваших группах включен контроллер cpuset. Этот контроллер в основном полезен в среде NUMA, где он позволяет точно определить, в каком ЦП/БД памяти ваши задачи разрешены.

По умолчанию обязательные cpuset.mems и cpuset.cpus не установлены, что означает, что для вашей задачи нет "свободного места", следовательно, ошибка.

Самый простой способ исправить это - включить cgroup.clone_children в 1 в корневой группе. В вашем случае это должно быть

echo 1 > /sys/fs/cgroup/docker/cgroup.clone_children

В основном он поручит системе автоматически инициализировать контейнер cpuset.mems и cpuset.cpus из своей родительской группы.

  • 1
    Это правильный ответ. Действительно, просто обновив Docker до чего угодно> = Docker 1.8 должен решить эту проблему. Это связано с github.com/opencontainers/runc/issues/133 Из этой проблемы еще один потенциальный echo 0 > /sys/fs/cgroup/cpuset/system.slice/cpuset.mems - « echo 0 > /sys/fs/cgroup/cpuset/system.slice/cpuset.mems
3

вы также можете использовать:

docker system prune

или только для томов:

docker volume prune
0

Если вы используете образ boot2docker через Docker Toolkit, проблема возникает из-за того, что на виртуальной машине boot2docker закончилось свободное пространство.

Когда вы делаете docker import или добавляете новое изображение, изображение копируется в /mnt/sda1, который мог бы быть заполнен.

Один из способов проверить, какое пространство у вас есть на изображении, - это ssh в vm и запустить df -h и проверить оставшееся пространство в /mnt/sda 1

Команда ssh docker-machine ssh default

Как только вы уверены, что это действительно проблема с пространством, вы можете либо очистить в соответствии с инструкциями в некоторых ответах по этому вопросу, либо вы можете изменить размер самого изображения boot2docker, увеличив пространство на /mnt/sda1

Здесь вы можете выполнить инструкции по изменению размера изображения https://gist.github.com/joost/a7cfa7b741d9d39c1307

0

1) Очистить оборванные изображения
docker rmi $(изображения докеров -f "dangling = true" -q)
2) Удалите ненужные тома
2) Удалить неиспользуемые изображения
2) Удалить неиспользуемые контейнеры

  • 0
    Для меня проблемой было слишком много изображений. После их очистки докер снова работает.
0

чистый докер, используя

docker images --no-trunc | grep '<none>' | awk '{ print $3 }' \
| xargs docker rm
Сообщество Overcoder
Наверх
Меню