Attention: lisez l’article en entier avant de taper une commande que vous pourriez regretter
Si vous utilisez Docker (que ça soit en production ou sur votre machine dedéveloppement) vous avez surement accumulé beaucoup de données maintenant inutiles. Il existe des outils comme docker-gc pour nettoyer tout ça, mais depuis l’API 1.25 docker intègre la commande prune
qui pourrait suffire amplement.
L’usage de base est plutôt simple:
$ sudo docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all build cache
Are you sure you want to continue? [y/N] y
Deleted Containers:
deleted: sha256:ea43728b2d10e7b0fe24036f9531caac96bd02f779b95a6620110f00ccd3b002
deleted: sha256:022db612b3070971ce7d51778806a1f995a9c3aa1a741a6c0be0bca603787387
...approximativement 2 gajillion de hashes...
Total reclaimed space: 5.64GB
Ça va enlever pas mal de choses, mais malheureusement pas tout ce qui est inutilisé (les images sans containers par exemple ne sont par retirées avec cette commande). Pour cela il faut ajouter l’option --all
:
$ sudo docker system prune --all
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all images without at least one container associated to them
- all build cache
Are you sure you want to continue? [y/N] y
... moar hashes...
Total reclaimed space: 26.78GB
C’est pas mal tout ça, mais pas encore idéal. Garder un peu de cache c’est quand même utile pour accélérer les choses. Pour cela il y a l’option--filter
(disponible uniquement à partir de l’API 1.28). Au moment ou j’écris ces lignes il n’y a que deux filtres disponibles: until
etlabel
. Dans mon cas j’utilise surtout until
qui va tout nettoyer jusqu’à une certaine date (utilisant un timestamp).
Évidemment, je ne m’amuse pas à taper un timestamp, mais j’utilise date
pour le générer:
$ sudo docker system prune --all --filter until=$(date -d "1 month ago" +%s)
Ici j’utilise une substitution avec $( commande )
qui permet d’exécuter une commande pour injecter son résultat sous forme de chaînes de caractères dans une autre commande. La commande date
se décompose en date -d <description de
. Ici le format de sortie
la date> <format de sortie>+%s
signifie “timestamp”. Jetez un oeil à man date
si vous voulez en savoir plus.
Et voilà 😃 J’ai rarement besoin de données plus vieilles qu’un mois (et même 1 mois est très conservateur, mais comme j’ai rarement accès à un bon débit je garde le plus possible).
Finalement, si vous avez l’âme d’un aventurier vous pouvez ajouter l’option--force
qui va lancer la commande sans confirmation nécessaire. Je l’utilise sur mon serveur d’intégration continue dans une tâche cron:
$ sudo docker system prune --force --all --filter until=$(date -d "1 week ago" +%s)
Joyeux ménage ♻️
Une note à propos de sudo
: sur ma machine de développement (qui est un système GNU/Linux), j’utilise Docker exclusivement via sudo
, car être dans le group docker
revient à donner les droits root à son utilisateur. Cela est dû au fait que docker est un daemon privilégié sur le système. Plus d’info dans la documentation officielle : Docker security.
Cet article a été initialement publié sur mayeu.me.
Top comments (0)