Помилка Docker: на пристрої не залишилось місця


329

Я встановив докер на машину 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
Іноді ви можете досягти обмеження розміру контейнера в залежності від вашого резервного місця. Це посилання показує, як це виправити для devicemapper.
jpaugh

4
У мене виникла помилка, коли на моєму диску не було входів. Перевіркаdf -ih
Кевін Сміт

@KevinSmyth Дуже дякую, що вказав на це. Я навіть не знав про значення обмежень у галузі до цього.
yosefrow

Відповіді:


337

У мене була така ж помилка і вирішити її так:

1. Видаливши осиротілі томи в Докер, ви можете використовувати вбудовану команду гучності докер. Вбудована команда також видаляє будь-який каталог у / var / lib / docker / volumes, який не є томом, тому переконайтеся, що ви там нічого не помістили, що хочете зберегти.

Попередження, будьте дуже обережні, якщо у вас є деякі дані, які ви хочете зберегти

Прибирати:

$ 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_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 rm" вимагає щонайменше 1 аргументу.
ІгорГанапольський

330

ОНОВЛЕННЯ
Команди нижче стали хаками, оскільки Докер розвивався. Нині найкраща практика є

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 для підрахунку файлів, а С - для сортування за кількістю файлів, щоб отримати приблизну оцінку того, що використовується для всіх ваших входів. Якщо проблема справді докер, це буде відразу зрозуміло каталогів, що використовують найбільшу кількість індезів.
yosefrow

2
Дійсно, це слід підкреслити і дати відповідь, оскільки це правильний підхід. Навколишнє середовище для будівництва забруднилось, і тепер тут docker system prune
хапають місця,

@zhrist Haha Я згоден
Джошуа Кук

@ coler-j Можливо ... якщо ви думаєте з точки зору оригінального високо специфічного питання. Але давайте бути чесними один з одним. Більшість людей не знаходять цього питання через неясний випадок використання ОЗ, а тому, що їх кеш-пам'ять просто не вистачає місця.
Джошуа Кук

@JoshuaCook - це насправді дуже поширена проблема: github.com/docker/for-win/isissue/1042 без реального вирішення. Просто намагаюся отримати першопричину, і це дуже засмучує. :(
coler-j

70

Перевірте, чи немає вільного місця на / var, оскільки саме тут Docker зберігає файли зображень за замовчуванням (в / var / lib / docker).

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

Далі змініть місце зберігання за допомогою параметра -g на демон докера або відредагувавши /etc/default/dockerта додавши -gпараметр до DOCKER_OPTS. -gвизначає розташування "Докерівської програми", яка в основному є всіма матеріалами, які Docker створює під час створення зображень та запуску контейнерів. Виберіть місце з великою кількістю місця, оскільки використовуваний простір на диску буде з часом збільшуватися. Якщо ви редагуєте /etc/default/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 / aufs / mnt?
user_mda

Не видаляйте цей матеріал вручну. Замість цього видаліть будь-які контейнери (включаючи вийшли) та зображення, які вам не потрібні. Ви повинні зробити це перед тим, як змінити параметр -g. Скористайтеся docker ps -aдля переліку всіх контейнерів (включаючи вийшли), а потім docker rmвидаліть їх. Використовуйтеdocker images списком усіх зображень, а потім docker rmiвидаліть їх. Сподіваємось, що це повинно очистити все (або більшість речей).
Кал

Дякую, таким чином очищення зображень та контейнерів очистило місце. Але для нового зображення все ще потрібно більше. Однак, на що повинен вказувати час виконання докера? Чи існує спосіб просто збільшити простір, який використовується докер для зберігання зображень?
user_mda

37

Як вже було сказано,

docker system prune

допомагає, але з Docker 17.06.1 і пізніших версій, не обрізаючи невикористані обсяги. Починаючи з Docker 17.06.1, наступні команди також скорочують томи:

docker system prune --volumes

З документації на Docker: https://docs.docker.com/config/pruning/

Команда prune system done - це ярлик, який обрізає зображення, контейнери та мережі. У Docker 17.06.0 та новіших версіях обсяги також обрізані. У Docker 17.06.1 і новіших версіях ви повинні вказати прапор - volumes для докер-системи, підрізаної для обрізання обсягів.

Якщо ви хочете вирізати обсяги та зберегти зображення та контейнери:

docker volume prune

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

Знову ж таки, я використовую це в своїх ек2-екземплярах при розробці 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 файл знову почав наповнюватися кількома ГБ матеріалів, але ніде близько 41 ГБ.


Оновлення

Через кілька місяців мій Docker.rawнаповнювався знову подібним розміром. Тож цей метод спрацював, але доводиться повторювати кожні кілька місяців. Для мене це добре.

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


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")

Це видалить вихідні та звисаючі зображення, що, сподіваємось, очищає простір пристрою.


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

Для мене проблемою було занадто багато зображень. Після їх очищення докер знову працює.
Тран трієт

9

Ви також можете використовувати:

docker system prune

або для просто обсягів:

docker volume prune

7

У моєму випадку встановлення ubuntu-сервера 18.04.1 [чомусь дивно] створило логічний об'єм LVM розміром всього 4 ГБ замість 750 ГБ. Тому при перетягуванні зображень я отримав би цю помилку "на пристрої не залишилось місця". Виправлення просте:

lvextend -l 100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

.. дивіться мій покроковий опис resize2fs у наступній темі: stackoverflow.com/questions/32485723/…
Alex

7

Я також стикався з цим питанням на машині RHEL. Я ніде не знайшов підходящого рішення у спільноті стека-переповнення та docker-hub. Якщо ви зіткнулися з цією проблемою навіть після команди нижче:

докер-система прун - всі

Рішення, яке остаточно спрацювало:

  1. інформація про докер
    • Щоб перевірити поточний драйвер зберігання докерів
    • Моя була: драйвер зберігання: devicemapper; Якщо у вас є драйвер пам’яті як overlay2, нічого не турбуйтеся. Рішення все одно буде працювати для вас.
  2. df -h
    • Це потрібно для перевірки наявних файлових систем на машині та шляху, де вони встановлені. Два змонтовані контури, щоб мати примітку:
    • / 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 path '/ 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 та додайте нижче в розділі [Служба]:
    • ExecStart =
    • ExecStart = / usr / bin / dockerd -s devicemapper --storage-opt dm.fs = xfs --storage-opt dm.basesize = 40GB -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 стоп-докер
  10. ps aux | grep -i докер | grep -v grep
    • Якщо вищевказана команда не отримала жодного виводу, перезавантажте системний демон на команду нижче.
  11. systemctl daemon-reload
  12. systemctl start docker
  13. інформація про докер
    • Ознайомтеся з наявним простором даних: 62,15 Гб після маутування до докера до нової файлової системи.
  14. Зроблено

Я шукав у всіх документах, як цього досягти! Дякую вам сер. Чи можемо ми позначити це однією з відповідей?
Вулегенд

6

Очистіть Docker за допомогою наступної команди:

docker images --no-trunc | grep '<none>' | awk '{ print $3 }' \
| xargs docker rmi

4

Ваші групи мають cpuset включений контролер. Цей контролер корисний здебільшого в середовищі NUMA, де він дозволяє чітко вказати, в якому ЦП / банку пам'яті дозволено запускати ваші завдання.

За замовчуванням обов'язкові cpuset.memsтаcpuset.cpus не встановлені, що означає, що для вашої задачі не залишилося місця, отже, помилка.

Найпростіший спосіб виправити це - включити cgroup.clone_children1 в кореневу групу. У вашому випадку так і має бути

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

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


1
Це правильна відповідь. Дійсно просто оновити Docker до чого-небудь> = Docker 1.8 повинен вирішити це. Це пов’язано з github.com/opencontainers/runc/isissue/133 Із випуску, ще одна потенційна echo 0 > /sys/fs/cgroup/cpuset/system.slice/cpuset.mems
розбіжність

2

Якщо ви використовуєте зображення boot2docker через Docker Toolkit, то проблема випливає з того, що у віртуальної машини boot2docker не вистачає місця.

Коли ви робите docker importабо додаєте нове зображення, зображення копіюється в/mnt/sda1 яке, можливо, стало повноцінним.

Один із способів перевірити, який простір у вас є в зображенні, - це забитися в vm і запустити df -h та перевірити залишився простір у / mnt / sda1

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

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

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


2

Якщо ви використовуєте Docker Desktop, ви можете збільшити розмір зображення диска в розширених налаштуваннях , перейшовши в Налаштування Докера .

Ось скріншот від macOS:

Докер робочий стіл на macOS, ресурси, розширений, розмір зображення на диску


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

якщо ви запустите інформацію докер-команд (він повинен показувати драйвер пам’яті як накладення)


0

Здається, існує кілька способів цього. У мене виникло питання про те, що зображення докерського диска досяг максимального розміру (Docker Whale -> Preferences -> Disk, якщо ви хочете переглянути розмір, який знаходиться в OSX).

Я підняв межу і було добре йти. Я впевнений, що очищення невикористаних зображень також спрацює.


0

Я запускаю команди нижче.

Після цього не потрібно перебудовувати зображення.

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

Вони вилучають контейнери, що вийшли / звисають, і томи, що звисають.


0

Для мене docker system pruneзробив трюк. Я бігаю Mac OS.


Це фактично працювало і на моєму, коли я намагався очистити простір, використаний на Mac OS. використання команди docker volume lsне повертало нічого, тому здавалося, що для зберігання в основному використовуються кеші та звисаючі зображення.
Тухін

-3
$ docker rm $(docker ps -aq)

Це працювало для мене

docker system prune 

здається, кращий варіант із останньою версією

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.