DEV Community

Mayeu
Mayeu

Posted on • Originally published at mayeu.me on

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 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

Enter fullscreen mode Exit fullscreen mode

Ç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

Enter fullscreen mode Exit fullscreen mode

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)

Enter fullscreen mode Exit fullscreen mode

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:

$ sudo docker system prune --force --all --filter until=$(date -d "1 week ago" +%s)

Enter fullscreen mode Exit fullscreen mode

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.

Latest comments (0)