Nettoyer les données non utilisées par Docker
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 de
dé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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ 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
:
1 2 3 4 5 6 7 8 9 10 |
$ 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
et
label
. 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:
1
|
$ 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
la date> <format de sortie>
. Ici le 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:
1
|
$ 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.
Did you enjoy this article? Don't want to miss any new posts and get exclusive content? Then hop into my newsletter :)
You can also contact me directly via email: m [-at-] mayeu [-dot-] me