Ошибка докера: на устройстве не осталось места
Я установил 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
Как я могу увеличить память? Где хранятся конфигурации системы?
Из Кал предложения:
Когда я избавился от всех изображений и контейнеров, он освободил немного места, и сборка изображений продолжалась дольше, чем заканчивалась с той же ошибкой. Итак, вопрос в том, к какому пространству это относится и как его настроить?
Ответы
Ответ 1
У меня была такая же ошибка и решить ее так:
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}
Ответ 2
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
.
Ответ 3
Убедитесь, что у вас есть свободное место в /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, создается куча файлов.
Ответ 4
Если это просто тестовая установка 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
.
Ответ 5
Как уже упоминалось,
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
Ответ 6
Докер оставляет повсюду изображения, которые могут занять ваше пространство. Чтобы очистить после 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")
Это удалит вышедшие и свисающие изображения, которые, мы надеемся, очистят пространство устройства.
Ответ 7
- Очистить привязанные изображения
docker rmi $(docker images -f "dangling=true" -q)
- Удалить ненужные тома
- Удалить неиспользуемые изображения
- Удалить неиспользованные контейнеры
Ответ 8
удалить сразу все неиспользуемые контейнеры, тома, сети и изображения (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?)
Ответ 9
вы также можете использовать:
docker system prune
или только для томов:
docker volume prune
Ответ 10
Очистите Docker с помощью следующей команды:
docker images --no-trunc | grep '<none>' | awk '{ print $3 }' \
| xargs docker rmi
Ответ 11
В моем случае установка 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
Ответ 12
В ваших группах включен контроллер cpuset
. Этот контроллер в основном полезен в среде NUMA, где он позволяет точно определить, в каком ЦП/БД памяти ваши задачи разрешены.
По умолчанию обязательные cpuset.mems
и cpuset.cpus
не установлены, что означает, что для вашей задачи нет "свободного места", следовательно, ошибка.
Самый простой способ исправить это - включить cgroup.clone_children
в 1 в корневой группе. В вашем случае это должно быть
echo 1 > /sys/fs/cgroup/docker/cgroup.clone_children
В основном он поручит системе автоматически инициализировать контейнер cpuset.mems
и cpuset.cpus
из своей родительской группы.
Ответ 13
Если вы используете образ 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
Ответ 14
Я также столкнулся с этой проблемой на машине RHEL. Я не нашел ни одного подходящего решения в сообществе ub и докера -h. Если вы столкнулись с этой проблемой даже после команды ниже:
черновая система докера --all
Решение, которое сработало окончательно:
- информация о докере
- Чтобы проверить текущий драйвер хранилища докера
- Мой был: Драйвер хранилища: устройство устройства; Если у вас есть драйвер хранилища как оверлей2, беспокоиться не о чем. Решение все еще будет работать для вас.
- дф -h
- Это делается для проверки доступных файловых систем на компьютере и пути их монтирования. Два смонтированных пути для заметки:
- /dev/mapper/rootvg -v ar 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.
- mkdir/apps/newdocker/docker
- chmod -R 777/apps/newdocker/docker
- Обновите файл docker.serive в Linux, который находится в: /usr/lib/systemd/system
- vi/usr/lib/systemd/system/docker.service
- если устройство хранения - devicemapper, прокомментируйте существующую строку ExecStart и добавьте ниже под [Service]:
- ExecStart =
- ExecStart =/usr/bin/dockerd -s устройство устройства - -s torage-opt dm.fs = xfs - -s torage-opt dm.basesize = 40 ГБ -g/apps/newdocker/docker --exec-opt native.cgroupdriver = cgroupfs
- Или, если запоминающее устройство наложено2:
- просто добавьте -g/apps/newdocker/docker в существующий оператор ExexStart.
- Что-то вроде ExecStart =/usr/bin/dockerd -g/apps/newdocker/docker -h fd:/ / --containerd =/run/containerd/containerd.sock
- rm -R f/var/lib/docker (удалит все существующие данные докера)
- systemctl stop docker
- PS Aux | grep -i докер | grep -v grep
- Если вышеприведенная команда не выдала никаких выходных данных, перезагрузите демон systemd с помощью следующей команды.
- демон systemctl -R eload
- systemctl запускает докер
- информация о докере
- Проверьте доступное пространство данных: 62,15 ГБ после подключения к докеру новой файловой системы.
- СДЕЛАННЫЙ
Ответ 15
Кажется, есть несколько способов, которыми это может произойти. Проблема, с которой я столкнулся, заключалась в том, что образ диска докера достиг максимального размера (Docker Whale → Preferences → Disk, если вы хотите посмотреть, какой размер у OSX).
Я повысила лимит и была готова идти. Я уверен, что очистка неиспользуемых изображений также подойдет.
Ответ 16
Я запускаю следующие команды.
После этого нет необходимости перестраивать изображения.
docker rm $(docker ps -qf 'status=exited')
docker rmi $(docker images -qf "dangling=true")
docker volume rm $(docker volume ls -qf dangling=true)
Они удаляют вышедшие/висячие контейнеры и висячие тома.
Ответ 17
Для меня docker system prune
сделал свое дело. Я бегу Mac OS.