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 les infos sur le 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 du système?
Parmi les suggestions de Kal:
Lorsque je me suis débarrassé de toutes les images et de tous les conteneurs, cela a libéré de l'espace et la génération d'images a duré plus longtemps avant d'échouer avec la même erreur. La question est donc de savoir à quel espace cela fait référence et comment le configurer?
J'ai eu la même erreur et le résoudre de cette façon:
1 . Supprimez les volumes orphelins dans Docker, vous pouvez utiliser la commande de volume intégrée dans le menu fixe. La commande intégrée supprime également tout répertoire de/var/lib/docker/volumes qui n'est pas un volume. Assurez-vous de ne rien mettre dedans que vous souhaitez enregistrer.
Attention, soyez très prudent si vous souhaitez conserver certaines données.
Nettoyer:
$ docker volume rm $(docker volume ls -qf dangling=true)
Commandes supplémentaires:
Liste des volumes suspendus:
$ docker volume ls -qf dangling=true
Répertoriez tous les volumes:
$ docker volume ls
2 Pensez également à supprimer toutes les images inutilisées.
Commencez par supprimer les images <none>
(celles-ci sont parfois générées lors de la création d’une image et si, pour une raison quelconque, la construction de l’image a été interrompue, elles y restent).
voici un bon script que j'utilise pour les supprimer
docker rmi $(docker images | grep '^<none>' | awk '{print $3}')
Ensuite, si vous utilisez Docker Compose pour générer des images localement pour chaque projet. Vous allez vous retrouver avec un grand nombre d'images généralement nommées comme votre dossier (par exemple, si votre dossier de projet s'appelle Bonjour, vous trouverez le nom d'images Hello_blablabla
). alors aussi envisager de supprimer toutes ces images
vous pouvez éditer le script ci-dessus pour les supprimer ou les supprimer manuellement avec
docker rmi {image-name}
METTRE &AGRAVE; JOUR
Les commandes ci-dessous sont devenues des hacks à mesure que Docker devenait plus développé. 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, commencez par retirer 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 par un via docker rm #CONTAINER_ID#
et docker rmi #IMAGE_ID
.
Vérifiez que vous avez suffisamment d’espace libre sur/var car Docker stocke les fichiers d’image par défaut (dans/var/lib/docker).
Commencez par nettoyer en utilisant docker ps -a
pour répertorier tous les conteneurs (y compris les conteneurs arrêtés) et docker rm
pour les supprimer; utilisez ensuite docker images
pour répertorier toutes les images que vous avez stockées et docker rmi
pour les supprimer.
Ensuite, changez l'emplacement de stockage avec une option -g sur le démon docker ou en modifiant /etc/default/docker
et en ajoutant l'option -g
à DOCKER_OPTS
. -g
spécifie l'emplacement du "runtime Docker", qui correspond en gros à tout ce que Docker crée lorsque vous créez des images et exécutez des conteneurs. Choisissez un emplacement offrant beaucoup d'espace, car l'espace disque utilisé aura tendance à augmenter avec le temps. Si vous éditez /etc/default/docker
, vous devrez redémarrer le démon docker pour que la modification soit prise en compte.
Vous devriez maintenant pouvoir créer une nouvelle image (ou en extraire une à partir de Docker Hub) et voir un tas de fichiers se créer dans le répertoire que vous avez spécifié avec l'option -g.
S'il ne s'agit que d'une installation test de Docker (c'est-à-dire non de production) et que vous ne vous souciez pas de nettoyer le 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, et non dans un processus d’assurance qualité ou de production sérieux. L’avantage, c’est que si vous avez votre/vos fichier (s) Docker, il est facile de le reconstruire et/ou docker pull
.
Docker laisse des images pendantes qui peuvent prendre de la place. Pour nettoyer après Docker, exécutez ce qui suit:
docker image Prune [-af if you want to force remove all images]
ou avec les anciennes versions de Docker:
docker rm $(docker ps -q -f 'status=exited')
docker rmi $(docker images -q -f "dangling=true")
Cela supprimera les images obsolètes et suspendues, ce qui, espérons-le, efface l'espace des périphériques.
Nettoyez Docker en utilisant la commande suivante:
docker images --no-trunc | grep '<none>' | awk '{ print $3 }' \
| xargs docker rmi
Le contrôleur cpuset
est activé dans vos groupes de contrôle. Ce contrôleur est surtout utile dans un environnement NUMA, dans lequel il permet de spécifier avec précision la banque de mémoire/processeur que vos tâches sont autorisées à exécuter.
Par défaut, les cpuset.mems
et cpuset.cpus
obligatoires ne sont pas définis, ce qui signifie qu'il ne reste "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_children
à 1 dans le groupe de contrôle racine. Dans votre cas, il devrait être
echo 1 > /sys/fs/cgroup/docker/cgroup.clone_children
En gros, il demandera au système d’initialiser automatiquement les cpuset.mems
et cpuset.cpus
du conteneur à partir de son groupe de contrôle parent.
docker rmi $(docker images -f "dangling=true" -q)
vous pouvez aussi utiliser:
docker system Prune
ou seulement pour les volumes:
docker volume Prune
pour supprimer tous les conteneurs, volumes, réseaux et images non utilisés simultanément ( https://docs.docker.com/engine/reference/commandline/system_Prune/#related-commands ):
docker system Prune -a -f
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
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? )
Comme déjà mentionné,
docker system Prune
aide, mais avec Docker 17.06.1 et versions ultérieures sans élaguer les volumes inutilisés. Depuis Docker 17.06.1, la commande suivante supprime également les volumes:
docker system Prune --volumes
Dans la documentation Docker: https://docs.docker.com/config/pruning/
La commande Élagage du système Docker est un raccourci permettant d'élaguer les images, les conteneurs et les réseaux. Dans Docker 17.06.0 et les versions antérieures, les volumes sont également élagués. Dans Docker 17.06.1 et les versions ultérieures, vous devez spécifier le drapeau --volumes pour les volumes Prune à Prune du système Docker.
Si vous souhaitez supprimer des volumes et conserver des images et des conteneurs:
docker volume Prune
J'ai également rencontré ce problème sur la machine RHEL. Je n'ai trouvé aucune solution appropriée sur la pile de débordement et la communauté docker-hub. Si vous faites face à ce problème même après la commande ci-dessous:
système de docker Prune --all
La solution qui a finalement fonctionné:
Si vous utilisez l'image boot2docker via Docker Toolkit, le problème provient du fait que la machine virtuelle boot2docker est saturée.
Lorsque vous créez un docker import
ou ajoutez une nouvelle image, celle-ci est copiée dans le /mnt/sda1
qui est peut-être devenu saturé.
Une façon de vérifier l’espace disponible dans l’image consiste à ssh dans la machine virtuelle, à exécuter df -h
et à 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 nettoyer en suivant les instructions de certaines des réponses à cette question ou choisir de redimensionner l'image de boot2docker elle-même en augmentant l'espace disponible sur /mnt/sda1
Vous pouvez suivre les instructions ici pour redimensionner l’image https://Gist.github.com/joost/a7cfa7b741d9d39c1307
On dirait que cela peut se produire de plusieurs manières. Le problème que j’avais était que l’image de disque du menu fixe avait atteint sa taille maximale (Docker Whale -> Préférences -> Disque si vous souhaitez voir quelle taille correspond à OSX).
J'ai augmenté la limite et j'étais prêt à partir. Je suis sûr que le nettoyage des images non utilisées fonctionnerait également.
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 de taille au lieu de 750 Go . Par conséquent, lors de l'extraction des images, l'erreur "aucun espace laissé sur le périphérique" . Le correctif est simple:
lvextend -l 100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv