Erreur Docker: pas d'espace disponible sur l'appareil

329

J'ai installé docker sur une machine Debian 7 de la manière suivante

$ 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

Après cela, lorsque j'ai essayé de créer une image, cela a échoué avec l'erreur suivante

 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"

Voici l'info docker

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

Comment puis-je augmenter la mémoire? Où sont stockées les configurations système?

D'après les suggestions de Kal:

Lorsque je me suis débarrassé de toutes les images et conteneurs, cela a libéré de l'espace et la construction de l'image a fonctionné plus longtemps avant d'échouer avec la même erreur. La question est donc de savoir de quel espace s'agit-il et comment le configurer?

user_mda
la source
1
Parfois, vous pouvez atteindre une limite de taille par conteneur , en fonction de votre backend de stockage. Ce lien montre comment le corriger pour devicemapper.
jpaugh
4
J'ai eu cette erreur lorsque mon disque était à court d'inodes. Chèquedf -ih
Kevin Smyth
@KevinSmyth Merci beaucoup de l'avoir signalé. Je n'étais même pas au courant de l'importance des limites d'inode avant cela.
yosefrow

Réponses:

337

J'ai eu la même erreur et je l'ai résolu de cette façon:

1 . Supprimez les volumes orphelins dans Docker, vous pouvez utiliser la commande intégrée de volume docker. La commande intégrée supprime également tout répertoire dans / var / lib / docker / volumes qui n'est pas un volume, alors assurez-vous de ne rien y avoir à enregistrer.

Attention, soyez très prudent si vous avez des données à conserver

Nettoyer:

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

Commandes supplémentaires:

Liste des volumes pendants:

$ docker volume ls -qf dangling=true

Liste tous les volumes:

$ docker volume ls

2. Pensez également à supprimer toutes les images inutilisées.

Débarrassez-vous d'abord des <none>images (celles-ci sont parfois générées lors de la construction d'une image et si pour une raison quelconque la construction de l'image a été interrompue, elles y restent).

voici un joli script que j'utilise pour les supprimer

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

Ensuite, si vous utilisez Docker Compose pour créer des images localement pour chaque projet. Vous vous retrouverez avec beaucoup d'images généralement nommées comme votre dossier (exemple si votre dossier de projet nommé Bonjour, vous trouverez le nom des images Hello_blablabla). alors pensez aussi à supprimer toutes ces images

vous pouvez modifier le script ci-dessus pour les supprimer ou les supprimer manuellement avec

docker rmi {image-name}

Mahmoud Zalt
la source
23
Juste une note: les commandes awk sur un Mac doivent être entourées de guillemets simples, pas de doubles, sinon cela est simplement ignoré.
ndtreviv
2
Je suis sur MAC et ça marche pour moi !! mais merci pour les conseils.
Mahmoud Zalt
2
Comme c'est étrange! Ça ne marche pas pour moi. Imprime simplement les mêmes résultats que le grep. Et bien. Des choses plus étranges se sont produites.
ndtreviv
3
À ce stade, vous pouvez utiliser le même filtre pour les images. docker images -qf dangling=trueet bien sûr les retirer avec docker rmi $(docker images -qf dangling=true).
Tyler Jones
3
J'obtiens une erreur: "docker volume rm" nécessite au moins 1 argument (s).
IgorGanapolsky
331

MISE À JOUR
Les commandes ci-dessous sont devenues des hacks à mesure que Docker se développe. La meilleure pratique actuelle est

docker system prune

Cela supprimera:

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

Comme ci-dessous, c'est nucléaire.


Pour nettoyer votre système, retirez d'abord les conteneurs

$ docker rm $(docker ps -aq)

puis supprimez les images

$ docker rmi $(docker images -q)

Ceci est bien sûr nucléaire et supprimera tous les conteneurs et toutes les images. Vous pouvez les supprimer un à la fois via docker rm #CONTAINER_ID#et docker rmi #IMAGE_ID.

Joshua Cook
la source
2
comme l'a souligné Kevin Smyth, cette erreur est probablement due au fait que vous manquez d'inodes avec lesquels vous pouvez voir df -ih. Pour diagnostiquer plus chirurgicalement, entrez ncdupuis appuyez sur c pour compter le nombre de fichiers et C pour trier par nombre de fichiers pour obtenir une estimation approximative de ce qui utilise tous vos inodes. Si le problème est en effet docker, il sera immédiatement apparent par les répertoires utilisant le plus d'inodes.
yosefrow du
2
Vraiment, cela devrait être voté et apporté une réponse, car c'est la bonne approche. L'environnement de construction a été pollué et maintenant pirater ici et là pourrait le corriger temporairement, mais l'approche appropriée devrait êtredocker system prune
zhrist
@zhrist Haha Je suis d'accord
Joshua Cook
@ coler-j Peut-être ... si vous pensez en termes de question originale très spécifique. Mais soyons honnêtes les uns avec les autres. La plupart des gens ne trouvent pas cette question en raison du cas d'utilisation obscur des OP, mais parce que leur cache de docker a simplement manqué d'espace.
Joshua Cook
@JoshuaCook c'est en fait un problème très courant: github.com/docker/for-win/issues/1042 sans véritable solution. J'essaie simplement de trouver la cause profonde de cela et c'est très frustrant. :(
coler-j
70

Vérifiez que vous avez de l'espace libre sur / var car c'est là que Docker stocke les fichiers image par défaut (dans / var / lib / docker).

Nettoyez d'abord les éléments en utilisant docker ps -apour répertorier tous les conteneurs (y compris ceux qui sont arrêtés) et docker rmpour les supprimer; puis utilisez docker imagespour répertorier toutes les images que vous avez stockées et docker rmipour les supprimer.

Modifiez ensuite l'emplacement de stockage avec une option -g sur le démon docker ou en modifiant /etc/default/dockeret en ajoutant l' -goption à DOCKER_OPTS. -gspécifie l'emplacement du "Docker runtime" qui est essentiellement tout ce que Docker crée lorsque vous créez des images et exécutez des conteneurs. Choisissez un emplacement avec beaucoup d'espace car l'espace disque utilisé aura tendance à augmenter avec le temps. Si vous modifiez /etc/default/docker, vous devrez redémarrer le démon docker pour que la modification prenne effet.

Vous devriez maintenant pouvoir créer une nouvelle image (ou en extraire une à partir de Docker Hub) et vous devriez voir un tas de fichiers créés dans le répertoire que vous avez spécifié avec l'option -g.

Kal
la source
Merci Kal, je n'ai pas pu trouver de documentation sur DOCKER_OPTS. Que signifie l'option -g et à quoi doit-elle être définie? Est-ce que les éléments sous docker / aufs / mnt peuvent également être supprimés?
user_mda
Hé rubis, je ne pense pas avoir jamais trouvé un vrai document sur DOCKER_OPTS, mais il y a des endroits ici et là dans la documentation qui parlent de le modifier. Le plus proche que je peux trouver se trouve à la fin de docs.docker.com/installation/ubuntulinux/… où il parle de la modification des paramètres DNS dans DOCKER_OPTS. Les options de DOCKER_OPTS sont juste passées au démon, donc la référence pour cela est docs.docker.com/reference/commandline/cli/#daemon . -g définit l'emplacement de base du "Docker runtime"
Kal
Est-ce que les éléments sous docker / aufs / mnt peuvent également être supprimés?
user_mda
Ne supprimez pas ce contenu manuellement. Au lieu de cela, supprimez tous les conteneurs (y compris ceux sortis) et les images dont vous n'avez pas besoin. Vous devez le faire avant de modifier l'option -g. Utilisez docker ps -apour répertorier tous les conteneurs (y compris ceux sortis), puis docker rmpour les supprimer. Utilisez docker imagespour répertorier toutes les images, puis docker rmipour les supprimer. Espérons que cela devrait nettoyer tout (ou la plupart des choses).
Kal
Merci, donc le fait de vider les images et les conteneurs a libéré de l'espace. Mais la nouvelle image a encore besoin de plus. Cependant, vers quoi le runtime du docker devrait-il pointer?, Existe-t-il un moyen d'augmenter simplement l'espace utilisé par le docker pour stocker les images?
user_mda
38

Comme déjà mentionné,

docker system prune

aide, mais avec Docker 17.06.1 et versions ultérieures sans élagage des volumes inutilisés. Depuis Docker 17.06.1, la commande suivante élague également les volumes:

docker system prune --volumes

Dans la documentation Docker: https://docs.docker.com/config/pruning/

La commande docker system prune est un raccourci qui élague les images, les conteneurs et les réseaux. Dans Docker 17.06.0 et versions antérieures, les volumes sont également élagués. Dans Docker 17.06.1 et versions ultérieures, vous devez spécifier l'indicateur --volumes pour le système Docker élaguer les volumes à élaguer.

Si vous souhaitez tailler des volumes et conserver des images et des conteneurs:

docker volume prune
RoBeaToZ
la source
3
docker volume prunem'a aidé aujourd'hui lorsque toutes les autres solutions ici ont cessé de fonctionner.
AVProgrammer
1
Une aide énorme - en plus de corriger l'erreur, cela a libéré de nombreux volumes d'espace sur mon disque dur.
Matt Browne
29

Si c'est juste une installation de test de Docker (c'est-à-dire pas de production) et que vous ne vous souciez pas de faire un nettoyage nucléaire, vous pouvez:

nettoyer tous les conteneurs: docker ps -a | sed '1 d' | awk '{print $1}' | xargs -L1 docker rm

nettoyer toutes les images: docker images -a | sed '1 d' | awk '{print $3}' | xargs -L1 docker rmi -f

Encore une fois, je l'utilise dans mes instances ec2 lors du développement de Docker, pas dans un cheminement de QA ou de production sérieux. La grande chose est que si vous avez votre (vos) Dockerfile (s), c'est facile à reconstruire et ou docker pull.

James
la source
1
Dans mon instance boot2docker, j'ai dû appeler docker images -a | sed '1 d' | awk '{print $3}' | xargs docker rmi -f. La version OS X BSD de xargsprend en charge l' -Loption, contrairement à la version de boot2docker.
orluke
1
Vous pouvez utiliser docker ps -a -qetc. pour éviter les manipulations de texte, c'est-à-dire docker rm $(docker ps -a -q); docker rmi -f $(docker images -a -q)devrait faire l'affaire
Niklas B.
21

pour supprimer tous les conteneurs, volumes, réseaux et images inutilisés à la fois ( https://docs.docker.com/engine/reference/commandline/system_prune/#related-commands ):

docker system prune -a -f --volumes

si cela ne suffit pas, on peut d'abord supprimer les conteneurs en cours d'exécution:

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

augmenter / var / lib / docker ou utiliser un autre emplacement avec plus d'espace est également une bonne alternative pour se débarrasser de cette erreur (voir Comment changer le répertoire d'installation de l'image docker? )

Guillaume
la source
docker system prunene supprime pas les volumes.
Bonifacio2
1
docker system prune -a -f --volumessupprimera les volumes.
Jimson Kannanthara James
19

Docker pour Mac

Ainsi , docker system pruneet docker system prune --volumessuggéré dans d' autres réponses libéré un peu d' espace à chaque fois, mais finalement chaque fois que je courais quoi que ce soit je recevais l'erreur.

Ce qui a réellement résolu le problème racine, c'était la suppression du Docker.rawfichier que Docker pour Mac utilise pour le stockage et son redémarrage.

Pour trouver ce fichier, ouvrez Docker pour Mac et accédez à *

Preferences > Resources > Advanced > Disk Image Location

* ceci est pour la version 2.2.0.5, mais sur les anciennes versions, il devrait être similaire

Sur les nouvelles versions de Docker pour Mac **, il vous montre la taille réelle de ce fichier sur le disque directement dans l'interface utilisateur, ainsi que sa taille maximale allouée. Vous verrez probablement que c'est énorme. Par exemple, sur ma machine, c'était 41 Go !

** Sur les anciennes versions, il ne vous montre pas l'utilisation réelle du disque dans l'interface utilisateur, et MacOS Finder affiche toujours la taille du fichier comme la taille maximale allouée. Vous pouvez vérifier la taille réelle du disque en ouvrant le répertoire dans un terminal et en exécutantdu -h Docker.raw

J'ai supprimé Docker.raw, redémarré Docker pour Mac et le fichier a été automatiquement créé à nouveau et redevenait 0 Go .

Tout a continué à fonctionner comme avant , bien que j'avais bien sûr perdu mon cache Docker. Comme prévu, après avoir exécuté quelques commandes Docker, le fichier a recommencé à se remplir avec quelques Go de données, mais loin des 41 Go .


Mettre à jour

Quelques mois plus tard, je me suis de Docker.rawnouveau rempli à une taille similaire. Cette méthode a donc fonctionné, mais doit être répétée tous les quelques mois. Pour moi ça va.

Une note sur pourquoi cela fonctionne - je dois supposer que c'est un bogue dans Docker pour Mac. Il semble vraiment que docker system prune/ docker system prune --volumesdevrait effacer entièrement le contenu de ce fichier, mais il semble que le fichier accumule d'autres éléments qui ne peuvent pas être supprimés par ces commandes. Quoi qu'il en soit, sa suppression manuelle résout le problème!

davnicwil
la source
15

Docker laisse des images pendantes qui peuvent occuper votre espace. Pour nettoyer après Docker, exécutez ce qui suit:

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

ou avec des versions plus anciennes de Docker:

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

Cela supprimera les images quittées et pendantes, ce qui, espérons-le, efface l'espace de l'appareil.

punkrockpolly
la source
14
  1. Des images nettes et nettes docker rmi $(docker images -f "dangling=true" -q)
  2. Supprimer les volumes indésirables
  3. Supprimer les images inutilisées
  4. Retirer les conteneurs inutilisés
josepainumkal
la source
Pour moi, le problème était d'avoir trop d'images. Après les avoir nettoyés, docker fonctionne à nouveau.
Tran Triet
9

vous pouvez aussi utiliser:

docker system prune

ou juste pour les volumes:

docker volume prune
alexanoïde
la source
7

Dans mon cas, l'installation d'ubuntu-server 18.04.1 [pour une raison étrange] a créé un volume logique LVM avec seulement 4 Go au lieu de 750 Go. Par conséquent, lorsque vous tirez des images, j'obtiens cette erreur "pas d'espace disponible sur l'appareil". La solution est simple:

lvextend -l 100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
Kostyantyn
la source
.. voir ma description étape par étape pour resize2fs dans le fil suivant: stackoverflow.com/questions/32485723/…
Alex
7

J'ai également rencontré ce problème sur la machine RHEL. Je n'ai trouvé aucune solution appropriée nulle part sur la communauté stack-overflow et docker-hub. Si vous rencontrez ce problème même après la commande ci-dessous:

système docker prune --all

La solution qui a finalement fonctionné:

  1. info docker
    • Pour vérifier le pilote de stockage Docker actuel
    • Le mien était: Pilote de stockage: devicemapper; Si vous avez un pilote de stockage en superposition2, rien à craindre. La solution fonctionnera toujours pour vous.
  2. df -h
    • Il s'agit de vérifier les systèmes de fichiers disponibles sur la machine et le chemin où ils sont montés. Deux chemins montés pour avoir une note:
    • / dev / mapper / rootvg-var 7.6G 1.2G 6.1G 16% / var
    • / dev / mapper / rootvg-apps 60G 9.2G 48G 17% / apps
    • Remarque - Par défaut, le chemin de stockage Docker est / var / lib / docker. Il a un espace disponible ~ 6 Go et donc tous les problèmes liés à l'espace. Donc, fondamentalement, je dois déplacer le stockage par défaut vers un autre stockage où l'espace disponible est plus important. Pour moi, son chemin d'accès au système de fichiers '/ dev / mapper / rootvg-apps' qui est monté sur / apps. La tâche consiste maintenant à déplacer / var / lib / docker vers quelque chose comme / apps / newdocker / docker.
  3. mkdir / apps / newdocker / docker
  4. chmod -R 777 / apps / newdocker / docker
  5. Mettre à jour le fichier docker.serive sur linux qui réside sous: / usr / lib / systemd / system
    • vi /usr/lib/systemd/system/docker.service
  6. si le périphérique de stockage est devicemapper, commentez la ligne ExecStart existante et ajoutez ci-dessous sous [Service]:
    • 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. Ou si le périphérique de stockage est superposé2:
    • il suffit d'ajouter -g / apps / newdocker / docker dans l'instruction ExexStart existante.
    • Quelque chose comme ExecStart = / usr / bin / dockerd -g / apps / newdocker / docker -H fd: // --containerd = / run / containerd / containerd.sock
  8. rm -rf / var / lib / docker (Il supprimera toutes les données de docker existantes)
  9. systemctl stop docker
  10. ps aux | grep -i docker | grep -v grep
    • Si aucune sortie n'a été produite par la commande ci-dessus, rechargez le démon systemd par la commande ci-dessous.
  11. systemctl daemon-reload
  12. systemctl start docker
  13. info docker
    • Consultez l'espace de données disponible: 62,15 Go après le montage sur Docker vers le nouveau système de fichiers.
  14. TERMINÉ
Mayank Chaudhary
la source
J'ai cherché partout dans les documents sur la façon d'y parvenir! Merci Monsieur. Pouvons-nous marquer cela comme l'une des réponses?
Vulegend
6

Nettoyez Docker à l'aide de la commande suivante:

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

Vos cgroups ont le cpusetcontrôleur activé. Ce contrôleur est surtout utile dans un environnement NUMA où il permet de spécifier finement quelle CPU / banque de mémoire vos tâches sont autorisées à exécuter.

Par défaut, les champs obligatoires cpuset.memset cpuset.cpusne sont pas définis, ce qui signifie qu'il n'y a "plus d'espace" pour votre tâche, d'où l'erreur.

Le moyen le plus simple de résoudre ce problème consiste à activer cgroup.clone_children1 dans le groupe de contrôle racine. Dans votre cas, il devrait être

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

Il demandera essentiellement au système d'initialiser automatiquement le conteneur cpuset.memset à cpuset.cpuspartir de son groupe de contrôle parent.

yadutaf
la source
1
Ceci est la bonne réponse. Vraiment simplement mettre à jour Docker vers n'importe quoi> = Docker 1.8 devrait le résoudre. Ceci est lié à github.com/opencontainers/runc/issues/133 Du problème, un autre contournement potentiel est "echo 0 > /sys/fs/cgroup/cpuset/system.slice/cpuset.mems
cpuguy83
2

Si vous utilisez l'image boot2docker via Docker Toolkit, le problème vient du fait que la machine virtuelle boot2docker est à court d'espace.

Lorsque vous faites une docker importou ajoutez une nouvelle image, l'image est copiée dans celle /mnt/sda1qui pourrait être pleine.

Une façon de vérifier l'espace dont vous disposez dans l'image est de ssh dans le vm et d'exécuter df -het de vérifier l'espace restant dans / mnt / sda1

La commande ssh est docker-machine ssh default

Une fois que vous êtes sûr qu'il s'agit bien d'un problème d'espace, vous pouvez soit nettoyer selon les instructions de certaines des réponses à cette question, soit choisir de redimensionner l'image boot2docker elle-même, en augmentant l'espace sur /mnt/sda1

Vous pouvez suivre les instructions ici pour effectuer le redimensionnement de l'image https://gist.github.com/joost/a7cfa7b741d9d39c1307

Nerrve
la source
2

Si vous utilisez Docker Desktop, vous pouvez augmenter la taille de l'image du disque dans les paramètres avancés en accédant aux préférences de Docker .

Voici la capture d'écran de macOS:

Docker Desktop sur macOS, Ressources, Avancé, Taille d'image disque

Kenorb
la source
1

Cela peut être dû à l'espace de stockage par défaut défini sur 40 Go (chemin par défaut, / var / lib / docker)

vous pouvez modifier le volume de stockage pour pointer vers un chemin différent

  • modifier le fichier -> / etc / sysconfig / docker-storage
  • mettre à jour sous la ligne (ajouter s'il n'existe pas)

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

  • Redémarrer docker systemctl stop docker systemctl daemon-reload systemctl start docker

si vous exécutez la commande docker info (elle devrait afficher le pilote de stockage en superposition)

Ajit Ganiger
la source
0

Il semble qu'il y ait plusieurs façons dont cela peut se produire. Le problème que j'avais était que l'image du disque Docker avait atteint sa taille maximale (Docker Whale -> Préférences -> Disque si vous voulez voir quelle taille est dans OSX).

J'ai augmenté la limite et j'étais prêt à partir. Je suis sûr que le nettoyage des images inutilisées fonctionnerait également.

SnellyBigoda
la source
0

J'exécute les commandes ci-dessous.

Il n'est pas nécessaire de reconstruire les images par la suite.

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

Ceux-ci enlèvent les conteneurs sortis / pendants et les volumes pendants.

M3RS
la source
0

Pour moi a docker system prunefait l'affaire. Je lance mac os.

Bildad N. Urandu
la source
Cela a également fonctionné sur le mien, lorsque j'essayais de libérer de l'espace sur Mac OS. l'utilisation de la commande docker volume lsne renvoyait rien, il semblait donc que le stockage était principalement utilisé par les caches et les images pendantes.
Tuhin
-3
$ docker rm $(docker ps -aq)

Cela a fonctionné pour moi

docker system prune 

semble être une meilleure option avec la dernière version

htnawsaj
la source