Errore Docker: nessuno spazio lasciato sul dispositivo


329

Ho installato la finestra mobile su un computer Debian 7 nel modo seguente

$ 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

Dopo ciò, quando ho provato a creare un'immagine per la prima volta, non è riuscito con il seguente errore

 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"

Ecco le informazioni sulla finestra mobile

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

Come posso aumentare la memoria? Dove sono archiviate le configurazioni di sistema?

Dai suggerimenti di Kal:

Quando mi sono liberato di tutte le immagini e i contenitori, ha liberato spazio e la creazione dell'immagine è durata più a lungo prima di fallire con lo stesso errore. Quindi la domanda è: a quale spazio si riferisce questo e come lo configuro?


1
A volte, è possibile raggiungere un limite di dimensione per contenitore , a seconda del back-end di archiviazione. Quel link mostra come risolverlo per devicemapper.
jpaugh,

4
Ho avuto questo errore quando il mio disco era fuori dagli inode. Controlladf -ih
Kevin Smyth,

@KevinSmyth Grazie mille per averlo segnalato. Non ero nemmeno a conoscenza del significato dei limiti di inode prima di questo.
yosefrow

Risposte:


337

Ho avuto lo stesso errore e risolverlo in questo modo:

1 Eliminare i volumi orfani in Docker, è possibile utilizzare il comando volume docker incorporato. Il comando integrato elimina anche qualsiasi directory in / var / lib / docker / volumi che non sia un volume, quindi assicurati di non aver inserito nulla che desideri salvare.

Attenzione stai molto attento con questo se hai dei dati che vuoi conservare

Pulire:

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

Comandi aggiuntivi:

Elenco dei volumi sospesi:

$ docker volume ls -qf dangling=true

Elenca tutti i volumi:

$ docker volume ls

2 Prendi anche in considerazione la rimozione di tutte le immagini non utilizzate.

Per prima cosa sbarazzarsi delle <none>immagini (a volte vengono generate durante la costruzione di un'immagine e se per qualsiasi motivo la costruzione dell'immagine è stata interrotta, rimangono lì).

ecco una bella sceneggiatura che uso per rimuoverli

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

Quindi se stai utilizzando Docker Compose per creare immagini localmente per ogni progetto. Ti ritroverai con molte immagini di solito chiamate come la tua cartella (esempio se la cartella del tuo progetto è Hello, troverai il nome delle immagini Hello_blablabla). quindi considera anche di rimuovere tutte queste immagini

puoi modificare lo script sopra per rimuoverli o rimuoverli manualmente con

docker rmi {image-name}


23
Solo una nota: i comandi awk su un Mac devono essere racchiusi tra virgolette singole, non doppie, altrimenti viene semplicemente ignorato.
ndtreviv,

2
Sono su MAC e funziona per me !! ma grazie per il consiglio.
Mahmoud Zalt,

2
Che strano! Non funziona per me. Stampa solo gli stessi risultati del grep. Ah bene. Sono successe cose più strane.
ndtreviv,

3
A questo punto, puoi utilizzare lo stesso filtro per le immagini. docker images -qf dangling=truee ovviamente rimuoverli con docker rmi $(docker images -qf dangling=true).
Tyler Jones,

3
Viene visualizzato un errore: "finestra mobile volume rm" richiede almeno 1 argomento / i.
IgorGanapolsky,

331

AGGIORNAMENTO
I seguenti comandi sono diventati degli hack man mano che Docker diventa più sviluppato. La migliore pratica attuale è

docker system prune

Questo rimuoverà:

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

Come sotto, questo è nucleare.


Per pulire il sistema, rimuovere innanzitutto i contenitori

$ docker rm $(docker ps -aq)

quindi rimuovere le immagini

$ docker rmi $(docker images -q)

Questo è ovviamente nucleare e rimuoverà tutti i contenitori e tutte le immagini. Puoi rimuoverli uno alla volta tramite docker rm #CONTAINER_ID#e docker rmi #IMAGE_ID.


2
come ha sottolineato Kevin Smyth, questo errore è probabilmente dovuto al fatto che stai esaurendo gli inode con cui puoi vedere df -ih. Per ncdueseguire una diagnosi più chirurgica, immettere quindi premere c per contare i file e C per ordinare in base al conteggio dei file per ottenere una stima approssimativa di ciò che utilizza tutti gli inode. Se il problema è effettivamente docker, sarà immediatamente evidente dalle directory che usano il maggior numero di inode.
yosefrow

2
In realtà questo dovrebbe essere votato e reso una risposta, in quanto è l'approccio corretto. L'ambiente per la costruzione è stato inquinato e ora hackerare qua e là potrebbe risolverlo temporaneamente, ma l'approccio corretto dovrebbe esseredocker system prune
zhrist

@zhrist Haha Sono d'accordo
Joshua Cook il

@ coler-j Forse ... se stai pensando in termini di domanda altamente specifica originale. Ma siamo onesti l'uno con l'altro. La maggior parte delle persone non trova questa domanda a causa dei casi d'uso oscuri dei PO, ma perché la loro cache docker ha esaurito lo spazio.
Joshua Cook,

@JoshuaCook è in realtà un problema molto comune: github.com/docker/for-win/issues/1042 senza una vera soluzione. Sto solo cercando di arrivare alla causa principale ed è molto frustrante. :(
coler-j

70

Verificare di disporre di spazio libero su / var poiché è qui che Docker archivia i file di immagine per impostazione predefinita (in / var / lib / docker).

Per prima cosa pulisci le cose usando docker ps -aper elencare tutti i contenitori (compresi quelli fermati) e docker rmrimuoverli; quindi usa docker imagesper elencare tutte le immagini che hai memorizzato e docker rmiper rimuoverle.

Quindi modificare la posizione di archiviazione con un'opzione -g sul daemon docker o modificando /etc/default/dockere aggiungendo l' -gopzione a DOCKER_OPTS. -gspecifica la posizione del "runtime Docker" che è sostanzialmente tutto ciò che Docker crea mentre costruisci immagini ed esegui container. Scegli una posizione con molto spazio poiché lo spazio su disco utilizzato tenderà a crescere nel tempo. Se si modifica /etc/default/docker, sarà necessario riavviare il daemon docker per rendere effettive le modifiche.

Ora dovresti essere in grado di creare una nuova immagine (o estrarne una dall'hub Docker) e dovresti vedere un mucchio di file che vengono creati nella directory che hai specificato con l'opzione -g.


Grazie Kal, non sono riuscito a trovare la documentazione su DOCKER_OPTS. Cosa significa l'opzione -g e su cosa dovrebbe essere impostata? Inoltre, le cose in docker / aufs / mnt possono essere eliminate?
user_mda

Ehi ruby, non credo di aver mai trovato un vero documento su DOCKER_OPTS, ma ci sono posti qua e là nella documentazione che parlano della sua modifica. Il più vicino che riesco a trovare è alla fine di docs.docker.com/installation/ubuntulinux/… dove parla della modifica delle impostazioni DNS in DOCKER_OPTS. Le opzioni in DOCKER_OPTS sono appena passate al demone, quindi il riferimento è docs.docker.com/reference/commandline/cli/#daemon . -g imposta la posizione di base di "Docker runtime"
Kal

Inoltre, le cose in docker / aufs / mnt possono essere eliminate?
user_mda

Non eliminare queste cose manualmente. Elimina invece i contenitori (inclusi quelli usciti) e le immagini che non ti servono. Dovresti farlo prima di cambiare l'opzione -g. Utilizzare docker ps -aper elencare tutti i contenitori (compresi quelli usciti) e quindi docker rmper rimuoverli. Utilizzare docker imagesper elencare tutte le immagini e quindi docker rmiper rimuoverle. Spero che questo dovrebbe ripulire tutto (o quasi tutte le cose).
Kal,

Grazie, quindi cancellare le immagini e i contenitori ha liberato un po 'di spazio. Ma l'immagine più recente ha ancora bisogno di più. Ma a cosa dovrebbe puntare il runtime della finestra mobile? Esiste un modo per aumentare lo spazio utilizzato dalla finestra mobile per archiviare le immagini?
user_mda

38

Come già detto,

docker system prune

aiuta, ma con Docker 17.06.1 e versioni successive senza potatura di volumi inutilizzati. Da Docker 17.06.1, anche il seguente comando elimina i volumi:

docker system prune --volumes

Dalla documentazione Docker: https://docs.docker.com/config/pruning/

Il comando di eliminazione del sistema docker è un collegamento che elimina immagini, contenitori e reti. In Docker 17.06.0 e precedenti, anche i volumi sono potati. In Docker 17.06.1 e versioni successive, è necessario specificare il flag --volumes per la potatura del sistema docker per potare i volumi.

Se vuoi potare volumi e conservare immagini e contenitori:

docker volume prune

3
docker volume prunemi ha aiutato oggi quando tutte le altre soluzioni qui hanno smesso di funzionare.
AVProgrammer

1
Enorme aiuto: oltre a correggere l'errore, questo ha liberato molti concerti sul mio disco rigido.
Matt Browne,

29

Se si tratta solo di un'installazione di prova di Docker (ovvero non di produzione) e non ti interessa eseguire una pulizia nucleare, puoi:

pulire tutti i contenitori: docker ps -a | sed '1 d' | awk '{print $1}' | xargs -L1 docker rm

pulisci tutte le immagini: docker images -a | sed '1 d' | awk '{print $3}' | xargs -L1 docker rmi -f

Ancora una volta, lo uso nelle mie istanze ec2 durante lo sviluppo di Docker, non in qualsiasi serio QA o percorso di produzione. La cosa bella è che se hai i tuoi Dockerfile, è facile ricostruire eo docker pull.


1
Nella mia istanza boot2docker ho dovuto chiamare docker images -a | sed '1 d' | awk '{print $3}' | xargs docker rmi -f. La versione BSD di OS X xargssupporta l' -Lopzione, a differenza della versione di boot2docker.
orluke

1
È possibile utilizzare docker ps -a -qecc. Per evitare le manipolazioni del testo, ovvero docker rm $(docker ps -a -q); docker rmi -f $(docker images -a -q)dovrebbe fare il trucco
Niklas B.

21

per rimuovere contemporaneamente tutti i contenitori, i volumi, le reti e le immagini non utilizzati ( https://docs.docker.com/engine/reference/commandline/system_prune/#related-commands ):

docker system prune -a -f --volumes

se non è abbastanza, si possono rimuovere prima i container in esecuzione:

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

aumentare / var / lib / docker o usare un'altra posizione con più spazio è anche una buona alternativa per sbarazzarsi di questo errore (vedi Come cambiare la directory di installazione dell'immagine docker? )


docker system prunenon rimuove i volumi.
Bonifacio2,

1
docker system prune -a -f --volumesrimuoverà i volumi.
Jimson Kannanthara James,

19

Docker per Mac

Così docker system prunee docker system prune --volumessuggerito in altre risposte liberate alcune , ogni volta ho spazio, ma alla fine ogni volta che ho eseguito qualcosa stavo ottenendo l'errore.

Ciò che risolveva effettivamente il problema di root era l'eliminazione del Docker.rawfile che Docker per Mac utilizza per l'archiviazione e il riavvio.

Per trovare quel file, apri Docker per Mac e vai a *

Preferences > Resources > Advanced > Disk Image Location

* questo è per la versione 2.2.0.5, ma nelle versioni precedenti dovrebbe essere simile

Nelle versioni più recenti di Docker per Mac **, mostra la dimensione effettiva di quel file su disco proprio lì nell'interfaccia utente, così come la sua dimensione massima allocata. Probabilmente vedrai che è enorme. Ad esempio sul mio computer era di 41 GB !

** Nelle versioni precedenti, non mostra l'utilizzo effettivo del disco nell'interfaccia utente e MacOS Finder mostra sempre la dimensione del file come dimensione massima allocata. È possibile verificare le dimensioni effettive sul disco aprendo la directory in un terminale ed eseguendolodu -h Docker.raw

Ho eliminato Docker.raw, riavviato Docker per Mac e il file è stato nuovamente creato automaticamente ed è tornato a essere 0 GB .

Tutto ha continuato a funzionare come prima , anche se ovviamente avevo perso la cache Docker. Come previsto, dopo aver eseguito alcuni comandi Docker il file ha iniziato a riempirsi di nuovo con alcuni GB di roba, ma in nessun luogo vicino a 41 GB .


Aggiornare

Alcuni mesi dopo, il mio Docker.rawriempimento è tornato a una dimensione simile. Quindi questo metodo ha funzionato, ma deve essere ripetuto ogni pochi mesi. Per me va bene.

Una nota sul perché funziona: devo presumere che sia un bug in Docker per Mac. Sembra davvero docker system prune/ docker system prune --volumesdovrebbe cancellare completamente il contenuto di questo file, ma sembra che il file accumuli altre cose che non possono essere eliminate da questi comandi. Ad ogni modo, eliminarlo manualmente risolve il problema!


15

Docker lascia in giro immagini penzolanti che possono occupare spazio. Per ripulire dopo Docker, eseguire quanto segue:

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

o con versioni precedenti di Docker:

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

Ciò rimuoverà le immagini uscite e penzolanti, che si spera liberino spazio sul dispositivo.


14
  1. Pulisci immagini appese docker rmi $(docker images -f "dangling=true" -q)
  2. Rimuovere i volumi indesiderati
  3. Rimuovi immagini inutilizzate
  4. Rimuovere i contenitori non utilizzati

Per me, il problema era avere troppe immagini. Dopo averli ripuliti, la finestra mobile funziona di nuovo.
Tran Triet,

9

puoi anche usare:

docker system prune

o solo per volumi:

docker volume prune

7

Nel mio caso l'installazione di Ubuntu-Server 18.04.1 [per qualche strana ragione] ha creato un volume logico LVM con dimensioni di soli 4 GB anziché 750 GB. Pertanto, quando si estraggono le immagini, viene visualizzato l'errore "spazio vuoto sul dispositivo". La correzione è semplice:

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

.. vedi la mia descrizione dettagliata per resize2fs nella seguente discussione: stackoverflow.com/questions/32485723/…
Alex

7

Ho riscontrato anche questo problema sulla macchina RHEL. Non ho trovato alcuna soluzione apt da nessuna parte nella comunità di stack-overflow e docker-hub. Se stai affrontando questo problema anche dopo il comando seguente:

docker system prune - tutti

La soluzione che ha funzionato finalmente:

  1. informazioni sulla finestra mobile
    • Per controllare il driver di archiviazione della finestra mobile corrente
    • Il mio era: Driver di archiviazione: devicemapper; Se si dispone di driver di archiviazione come overlay2, non c'è nulla di cui preoccuparsi. La soluzione funzionerà ancora per te.
  2. df -h
    • Questo per verificare i file system disponibili sulla macchina e il percorso in cui sono montati. Due percorsi montati per avere una nota:
    • / dev / mapper / rootvg-var 7.6G 1.2G 6.1G 16% / var
    • / dev / mapper / rootvg-apps 60G 9.2G 48G 17% / apps
    • Nota : per impostazione predefinita, il percorso di archiviazione della finestra mobile è / var / lib / docker. Ha spazio disponibile ~ 6 GB e quindi tutti i problemi relativi allo spazio. Quindi, fondamentalmente, devo spostare lo spazio di archiviazione predefinito in un altro spazio di archiviazione in cui lo spazio disponibile è maggiore. Per me il suo percorso del file sysyem '/ dev / mapper / rootvg-apps' che è montato su / apps. Ora il compito è spostare / var / lib / docker in qualcosa come / apps / newdocker / docker.
  3. mkdir / apps / newdocker / docker
  4. chmod -R 777 / apps / newdocker / docker
  5. Aggiorna il file docker.serive su linux che risiede in: / usr / lib / systemd / system
    • vi /usr/lib/systemd/system/docker.service
  6. se il dispositivo di memorizzazione è devicemapper, commentare la linea ExecStart esistente e aggiungere sotto in [Servizio]:
    • 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. O se il dispositivo di archiviazione è overlay2:
    • basta aggiungere -g / apps / newdocker / docker nell'istruzione ExexStart esistente.
    • Qualcosa come ExecStart = / usr / bin / dockerd -g / apps / newdocker / docker -H fd: // --containerd = / run / containerd / containerd.sock
  8. rm -rf / var / lib / docker (eliminerà tutti i dati docker esistenti)
  9. finestra mobile stop systemctl
  10. ps aux | grep -i docker | grep -v grep
    • Se non è stato prodotto alcun output dal comando precedente, ricaricare il demone systemd con il comando seguente.
  11. systemctl daemon-reload
  12. finestra mobile start systemctl
  13. informazioni sulla finestra mobile
    • Dai un'occhiata allo spazio dati disponibile: 62.15 GB dopo il mouting sulla finestra mobile nel nuovo file system.
  14. FATTO

Ho cercato in tutti i documenti su come raggiungere questo obiettivo! Grazie Signore. Possiamo contrassegnarlo come una delle risposte?
Vulegend il

6

Pulisci Docker usando il comando seguente:

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

4

I tuoi cgroup hanno il cpuset controller abilitato. Questo controller è utile soprattutto nell'ambiente NUMA dove consente di specificare con precisione quale banco CPU / memoria è autorizzato a eseguire le attività.

Di default è obbligatorio cpuset.memsecpuset.cpus non sono impostati, il che significa che "non c'è più spazio" per l'attività, quindi l'errore.

Il modo più semplice per risolvere questo problema è abilitare cgroup.clone_children1 nel cgroup radice. Nel tuo caso, dovrebbe essere

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

Fondamentalmente indicherà al sistema di inizializzare automaticamente il container cpuset.memse cpuset.cpusdal loro cgroup principale.


1
Questa è la risposta corretta Semplicemente l'aggiornamento di Docker a qualsiasi cosa> = Docker 1.8 dovrebbe risolverlo. Questo è correlato a github.com/opencontainers/runc/issues/133 Dal problema, un'altra potenziale soluzione è "echo 0 > /sys/fs/cgroup/cpuset/system.slice/cpuset.mems
cpuguy83,

2

Se si utilizza l'immagine boot2docker tramite Docker Toolkit, il problema deriva dal fatto che la macchina virtuale boot2docker ha esaurito lo spazio.

Quando fai una docker importo aggiungi una nuova immagine, l'immagine viene copiata nella /mnt/sda1quale potrebbe essere piena.

Un modo per verificare quale spazio è disponibile nell'immagine, è ssh in vm ed eseguire df -he controllare lo spazio rimanente in / mnt / sda1

Il comando ssh è docker-machine ssh default

Una volta che sei sicuro che si tratti effettivamente di un problema di spazio, puoi ripulire secondo le istruzioni in alcune delle risposte a questa domanda, oppure puoi scegliere di ridimensionare l'immagine boot2docker stessa, aumentando lo spazio su /mnt/sda1

Puoi seguire le istruzioni qui per eseguire il ridimensionamento dell'immagine https://gist.github.com/joost/a7cfa7b741d9d39c1307


2

Se stai usando Docker Desktop, puoi aumentare la dimensione dell'immagine del disco in Impostazioni avanzate andando su Preferenze di Docker .

Ecco lo screenshot di macOS:

Docker Desktop su macOS, Risorse, Avanzate, Dimensione immagine disco


1

Potrebbe essere dovuto allo spazio di archiviazione predefinito impostato su 40 GB (percorso predefinito, / var / lib / docker)

è possibile modificare il volume di archiviazione in modo che punti a un percorso diverso

  • modifica file -> / etc / sysconfig / docker-storage
  • aggiorna sotto la riga (aggiungi se non esiste)

DOCKER_STORAGE_OPTIONS = '- storage-driver = overlay --graph = CUSTOM_PATH'

  • Riavvia docker systemctl stop docker systemctl daemon-reload systemctl start docker

se si eseguono informazioni sulla finestra mobile dei comandi (dovrebbe mostrare il driver di archiviazione come overlay)


0

Sembra che ci siano alcuni modi in cui ciò può accadere. Il problema che ho avuto è stato che l'immagine del disco docker aveva raggiunto la dimensione massima (Docker Whale -> Preferenze -> Disco se si desidera visualizzare le dimensioni in OSX).

Ho superato il limite ed è stato bello andare. Sono sicuro che anche la pulizia di immagini inutilizzate funzionerebbe.


0

Eseguo i seguenti comandi.

Non è necessario ricostruire le immagini in seguito.

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

Rimuovono i contenitori usciti / penzolanti e i volumi penzolanti.


0

Per me ha docker system prunefatto il trucco. Sto eseguendo Mac OS.


Questo ha funzionato anche sul mio, quando stavo cercando di liberare spazio esaurito su Mac OS. l'uso del comando docker volume lsnon restituiva nulla, quindi sembrava che l'archiviazione fosse utilizzata principalmente da cache e immagini sospese.
Tuhin,

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

Questo ha funzionato per me

docker system prune 

sembra essere l'opzione migliore con l'ultima versione

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.