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

329

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

$ echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list
$ sudo apt-get update
$ 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

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

Из предложений Кэла:

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

user_mda
источник
1
Иногда вы можете установить ограничение по размеру для каждого контейнера в зависимости от серверной части хранилища. Эта ссылка показывает, как это исправить для устройства устройства.
jpaugh
4
У меня была эта ошибка, когда на моем диске не было inode. Проверьтеdf -ih
Кевин Смит
@KevinSmyth Большое спасибо за указание на это. Я даже не знал о значении пределов inode до этого.
yosefrow

Ответы:

337

У меня была такая же ошибка, и я решил ее следующим образом:

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

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

Очистка:

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

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

Список висящих томов:

$ docker volume ls -qf dangling=true

Перечислите все тома:

$ docker volume ls

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

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

вот хороший скрипт, который я использую, чтобы удалить их

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

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

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

docker rmi {image-name}

Махмуд Зальт
источник
23
Просто примечание: команды awk на Mac должны быть заключены в одинарные кавычки, а не в двойные, иначе они просто игнорируются.
ndtreviv
2
Я на MAC, и он работает на меня! но спасибо за совет.
Махмуд Залт
2
Как странно! Это не работает для меня. Просто выводит те же результаты, что и grep. Ах хорошо. Странные вещи произошли.
ndtreviv
3
На этом этапе вы можете использовать тот же фильтр для изображений. docker images -qf dangling=trueи, конечно, удалить их с помощью docker rmi $(docker images -qf dangling=true).
Тайлер Джонс
3
Я получаю сообщение об ошибке: для "docker volume rm" требуется как минимум 1 аргумент (ы).
Игорь Ганапольский,
331

ОБНОВЛЕНИЕ
Команды ниже стали хаки, поскольку 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
как указал Кевин Смит, эта ошибка, вероятно, связана с тем, что у вас закончились иноды, которые вы можете видеть df -ih. Чтобы выполнить более хирургическую диагностику, введите, ncduзатем нажмите c для подсчета файлов и C для сортировки по количеству файлов, чтобы получить приблизительную оценку того, что использует все ваши inode. Если проблема действительно в докере, это будет сразу видно по каталогам, использующим наибольшее количество инодов.
yosefrow
2
На самом деле за это следует проголосовать и сделать ответ, так как это правильный подход. Окружающая среда для строительства была загрязнена, и теперь взломать кое-где это может временное исправление, но правильный подход должен бытьdocker system prune
Христос
@zhrist Хаха, я согласен
Джошуа Кук
@ coler-j Может быть ... если вы думаете с точки зрения оригинального очень специфического вопроса. Но давайте будем честны друг с другом. Большинство людей не находят этот вопрос из-за неясного варианта использования OP, а потому что в их кеше докера просто не хватило места.
Джошуа Кук
@ JoshuaCook это на самом деле очень распространенная проблема: github.com/docker/for-win/issues/1042 без реального решения. Просто пытаюсь найти причину этого, и это очень расстраивает. :(
coler-j
70

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

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

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

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

Кал
источник
Спасибо, Кэл, я не смог найти документацию по DOCKER_OPTS. Что означает опция -g и для чего она должна быть установлена? Также можно удалить содержимое под docker / aufs / mnt?
user_mda
Эй, Рубин, я не думаю, что когда-либо нашел настоящий документ о DOCKER_OPTS, но в документации есть места, где говорится о редактировании. Самое близкое, что я могу найти, находится в конце docs.docker.com/installation/ubuntulinux/…, где говорится о редактировании настроек DNS в DOCKER_OPTS. Параметры в DOCKER_OPTS просто передаются демону, поэтому ссылка на них - docs.docker.com/reference/commandline/cli/#daemon . -g устанавливает базовое местоположение «среды выполнения Docker»
Kal
Также можно удалить содержимое под docker / aufs / mnt?
user_mda
Не удаляйте эти вещи вручную. Вместо этого удалите все контейнеры (включая вышедшие) и изображения, которые вам не нужны. Вы должны сделать это перед изменением опции -g. Используйте docker ps -aдля docker rmвывода списка всех контейнеров (включая вышедшие), а затем для их удаления. Используйте docker imagesдля отображения всех изображений, а затем docker rmiдля их удаления. Надеюсь, это должно очистить все (или большинство вещей).
Кал
Спасибо, поэтому очистка изображений и контейнеров очистили некоторое пространство. Но более новое изображение все еще нуждается в большем количестве. Однако на что должна указывать среда выполнения докера? Есть ли способ просто увеличить пространство, используемое докером для хранения изображений?
user_mda
38

Как уже упоминалось,

docker system prune

помогает, но с Docker 17.06.1 и более поздними версиями без удаления неиспользуемых томов. Начиная с Docker 17.06.1, следующая команда также удаляет тома:

docker system prune --volumes

Из документации Docker: https://docs.docker.com/config/pruning/

Команда docker system prune - это ярлык, который удаляет изображения, контейнеры и сети. В Docker 17.06.0 и более ранних версиях тома также удаляются. В Docker 17.06.1 и более поздних версиях вы должны указать флаг --volumes для удаления из системы Docker для удаления томов.

Если вы хотите сократить объемы и сохранить изображения и контейнеры:

docker volume prune
RoBeaToZ
источник
3
docker volume pruneпомог мне сегодня, когда все другие решения здесь перестали работать.
AVProgrammer
1
Огромная помощь - в дополнение к исправлению ошибки, это освободило много гигабайт места на моем жестком диске.
Мэтт Браун
29

Если это просто тестовая установка 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. Версия OS X BSD xargsподдерживает эту -Lопцию, в отличие от версии boot2docker.
orluke
1
Вы можете использовать docker ps -a -qи т. Д., Чтобы избежать текстовых манипуляций, т.е. docker rm $(docker ps -a -q); docker rmi -f $(docker images -a -q)должны делать свое дело
Никлас Б.
21

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

docker system prune -a -f --volumes

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

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

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

Гийом
источник
docker system pruneне удаляет тома
Bonifacio2
1
docker system prune -a -f --volumesудалит тома.
Джимсон Каннантхара Джеймс
19

Докер для Mac

Так docker system pruneи docker system prune --volumesпредлагалось в других ответах освобождать какое-то место каждый раз, но в конце концов каждый раз, когда я запускал что-либо, я получал ошибку.

Что действительно исправило проблему с корнем, так это удаление Docker.rawфайла, который Docker для Mac использует для хранения, и перезапуск его.

Чтобы найти этот файл, откройте Docker для Mac и перейдите к *

Preferences > Resources > Advanced > Disk Image Location

* это для версии 2.2.0.5, но на старых версиях должно быть похоже

В более новых версиях Docker для Mac ** он показывает фактический размер этого файла на диске прямо в интерфейсе пользователя, а также его максимальный выделенный размер. Вы, вероятно, увидите, что это массивно. Например на моей машине было 41Гб !

** В старых версиях он не показывает фактическое использование диска в пользовательском интерфейсе, а MacOS Finder всегда показывает размер файла в качестве максимального выделенного размера. Вы можете проверить фактический размер на диске, открыв каталог в терминале и запустивdu -h Docker.raw

Я удалил Docker.raw, перезапустил Docker для Mac, и файл был автоматически создан снова и вернулся к размеру 0 ГБ .

Все продолжало работать, как и раньше , хотя, конечно, я потерял кэш Docker. Как и ожидалось, после запуска нескольких команд Docker файл снова начал заполняться несколькими гигабайтами, но не ближе 41 Гб.


Обновить

Через несколько месяцев мой Docker.rawснова наполнился до такого же размера. Таким образом, этот метод работал, но должен повторяться каждые несколько месяцев. Для меня это хорошо.

Примечание о том, почему это работает - я должен предположить, что это ошибка в Docker для Mac. На самом деле кажется, что docker system prune/ docker system prune --volumesдолжен полностью очистить содержимое этого файла, но, похоже, файл накапливает другие данные, которые не могут быть удалены этими командами. Во всяком случае, удаление его вручную решает проблему!

davnicwil
источник
15

Докер оставляет повсюду изображения, которые могут занять ваше пространство. Чтобы очистить после Docker, выполните следующее:

docker image prune [-af if you want to force remove all images]

или с более старыми версиями Docker:

docker rm $(docker ps -q -f 'status=exited')
docker rmi $(docker images -q -f "dangling=true")

Это удалит вышедшие и свисающие изображения, которые, мы надеемся, очистят пространство устройства.

punkrockpolly
источник
14
  1. Чистые оборванные изображения docker rmi $(docker images -f "dangling=true" -q)
  2. Удалить ненужные тома
  3. Удалить неиспользуемые изображения
  4. Удалить неиспользованные контейнеры
josepainumkal
источник
Для меня проблемой было слишком много изображений. После их очистки докер снова работает.
Чан Триет
9

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

docker system prune

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

docker volume prune
alexanoid
источник
7

В моем случае установка ubuntu-server 18.04.1 [по какой-то странной причине] создала логический том LVM размером всего 4 ГБ вместо 750 ГБ. Поэтому при извлечении изображений я получаю эту ошибку "нет места на устройстве". Исправить это просто:

lvextend -l 100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
Kostyantyn
источник
.. посмотрите мое пошаговое описание resize2fs в следующей теме: stackoverflow.com/questions/32485723/…
Alex
7

Я также столкнулся с этой проблемой на машине RHEL. Я не нашел ни одного подходящего решения для сообщества переполнения стека и Docker-Hub. Если вы столкнулись с этой проблемой даже после команды ниже:

докер системы чернослив - все

Решение, которое сработало окончательно:

  1. информация о докере
    • Чтобы проверить текущий драйвер хранилища докера
    • Мой был: Драйвер хранилища: устройство устройства; Если у вас есть драйвер хранилища как оверлей2, беспокоиться не о чем. Решение все еще будет работать для вас.
  2. дф-ч
    • Это делается для проверки доступных файловых систем на компьютере и пути их монтирования. Два смонтированных пути для заметки:
    • / dev / mapper / rootvg-var 7.6G 1.2G 6.1G 16% / var
    • / dev / mapper / rootvg-apps 60G 9,2G 48G 17% / приложения
    • Примечание. По умолчанию путь хранения докера - / var / lib / docker. Имеется свободное пространство ~ 6 ГБ и, следовательно, все вопросы, связанные с пространством. В общем, я должен переместить хранилище по умолчанию в другое хранилище, где больше свободного места. Для меня это путь к файлу sysyem '/ dev / mapper / rootvg-apps', который смонтирован на / apps. Теперь задача состоит в том, чтобы переместить / var / lib / docker в нечто вроде / apps / newdocker / docker.
  3. mkdir / apps / newdocker / docker
  4. chmod -R 777 / apps / newdocker / docker
  5. Обновите файл docker.serive в Linux, который находится в: / usr / lib / systemd / system
    • vi /usr/lib/systemd/system/docker.service
  6. если устройство хранения - devicemapper, прокомментируйте существующую строку ExecStart и добавьте ниже под [Service]:
    • ExecStart =
    • ExecStart = / usr / bin / dockerd -s устройство устройства --storage-opt dm.fs = xfs --storage-opt dm.basesize = 40 ГБ -g / apps / newdocker / docker --exec-opt native.cgroupdriver = cgroupfs
  7. Или, если запоминающее устройство наложено2:
    • просто добавьте -g / apps / newdocker / docker в существующий оператор ExexStart.
    • Что-то вроде ExecStart = / usr / bin / dockerd -g / apps / newdocker / docker -H fd: // --containerd = / run / containerd / containerd.sock
  8. rm -rf / var / lib / docker (удалит все существующие данные докера)
  9. systemctl stop docker
  10. PS Aux | grep -i докер | grep -v grep
    • Если вышеприведенная команда не выдала никаких выходных данных, перезагрузите демон systemd с помощью следующей команды.
  11. systemctl демон-перезагрузка
  12. systemctl запускает докер
  13. информация о докере
    • Проверьте доступное пространство данных: 62,15 ГБ после подключения к докеру новой файловой системы.
  14. СДЕЛАНО
Mayank Chaudhary
источник
Я просматривал все документы о том, как этого добиться! Спасибо, сэр. Можем ли мы пометить это как один из ответов?
Vulegend
6

Очистите Docker с помощью следующей команды:

docker images --no-trunc | grep '<none>' | awk '{ print $3 }' \
| xargs docker rmi
Ашок Вагмаре
источник
4

Ваши cgroups имеют cpusetвключенный контроллер. Этот контроллер в основном полезен в среде NUMA, где он позволяет точно указать, какой процессор / банк памяти разрешено запускать вашим задачам.

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

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

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

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

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

Если вы используете образ boot2docker с помощью Docker Toolkit, то проблема заключается в том, что виртуальной машине boot2docker не хватило места.

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

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

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

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

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

Nerrve
источник
2

Если вы используете Docker Desktop, вы можете увеличить размер образа диска в дополнительных настройках , перейдя в « Настройки Docker» .

Вот скриншот с macOS:

Docker Desktop на macOS, Ресурсы, Дополнительно, Размер образа диска

kenorb
источник
1

Это может быть связано с тем, что в хранилище по умолчанию установлено 40 ГБ (путь по умолчанию, / var / lib / docker)

Вы можете изменить объем хранилища, чтобы указать другой путь

  • отредактировать файл -> / etc / sysconfig / docker-storage
  • обновить ниже строки (добавить, если не существует)

DOCKER_STORAGE_OPTIONS = '- драйвер хранилища = оверлей --graph = CUSTOM_PATH'

  • Перезапустите docker systemctl stop docker systemctl daemon-reload systemctl start docker

если вы запустите команду docker info (она должна показывать драйвер хранилища как оверлей)

Аджит Ганигер
источник
0

Кажется, есть несколько способов, которыми это может произойти. Проблема, с которой я столкнулся, заключалась в том, что образ диска докера достиг максимального размера (Docker Whale -> Preferences -> Disk, если вы хотите посмотреть, какой размер у OSX).

Я поднял предел и был готов идти. Я уверен, что очистка неиспользуемых изображений также подойдет.

SnellyBigoda
источник
0

Я запускаю следующие команды.

После этого нет необходимости перестраивать изображения.

docker rm $(docker ps -qf 'status=exited')
docker rmi $(docker images -qf "dangling=true")
docker volume rm $(docker volume ls -qf dangling=true)

Они удаляют вышедшие / висящие контейнеры и висячие тома.

M3RS
источник
0

Для меня docker system pruneсделали свое дело. Я бегу Mac OS.

Билдад Н. Уранду
источник
Это тоже сработало у меня, когда я пытался очистить пространство, используемое в Mac OS. использование команды docker volume lsничего не возвращало, поэтому казалось, что хранилище в основном использовалось кешами и висящими изображениями.
Тухин
-3
$ docker rm $(docker ps -aq)

Это сработало для меня

docker system prune 

кажется, лучший вариант с последней версией

htnawsaj
источник