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

Я установил 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

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

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

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

  1. информация о докере
    • Чтобы проверить текущий драйвер хранилища докера
    • Мой был: Драйвер хранилища: устройство устройства; Если у вас есть драйвер хранилища как оверлей2, беспокоиться не о чем. Решение все еще будет работать для вас.
  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.
  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 устройство устройства - -s torage-opt dm.fs = xfs - -s torage-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 -R f/var/lib/docker (удалит все существующие данные докера)
  9. systemctl stop docker
  10. PS Aux | grep -i докер | grep -v grep
    • Если вышеприведенная команда не выдала никаких выходных данных, перезагрузите демон systemd с помощью следующей команды.
  11. демон systemctl -R eload
  12. systemctl запускает докер
  13. информация о докере
    • Проверьте доступное пространство данных: 62,15 ГБ после подключения к докеру новой файловой системы.
  14. СДЕЛАННЫЙ

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