Existe-t-il des meilleures pratiques et / ou des outils pour nettoyer régulièrement les anciennes images Docker?

13

Existe-t-il une méthode élégante ou une meilleure pratique pour supprimer les anciennes images du registre Docker?

Je vois beaucoup de demandes / problèmes ici: https://github.com/docker/docker-registry/labels/delete , mais je n'ai pas trouvé de bonne solution / populaire pour cela.

Alors, existe-t-il un outil ou une technique qui pourrait m'aider à le faire?

De plus, y a-t-il des meilleures pratiques que vous suivez en le faisant?

Dawny33
la source
2
Demandez-vous comment nettoyer le registre? (Quel est le lien et la question que vous fournissez), mais la réponse acceptée n'est pas de nettoyer le registre, mais de nettoyer votre docker local.
dalore

Réponses:

10

J'ai eu de la chance avec Spotify / docker-gc . Il peut être exécuté depuis cron ou comme conteneur docker.

Un conteneur Docker simple et un script de récupération de place d'image.

  • Les conteneurs sortis il y a plus d'une heure sont supprimés.
  • Les images qui n'appartiennent à aucun conteneur restant après cela sont supprimées.
Ahmed Elsabbahy
la source
2
À première vue, il semble être, derrière tous les trucs bash, plus ou moins un sous-ensemble des one-liners de la réponse de @rombob. Est-ce vrai, ou y a-t-il une "intelligence" en ce docker-gcqui me manque?
AnoE
1
Op lie et pose une question sur la façon de nettoyer du registre, mais docker-gc ne nettoie pas du registre, il nettoie simplement de votre machine locale. Je suppose
qu'OP
La page de Docker-gc recommande désormais d'utiliser à la docker system pruneplace. Mais je n'ai pas trouvé comment exclure certaines images de la suppression avec le pruneau de Docker. Y a-t-il un moyen d'exclure certaines images avec docker system prune?
Alexander Artemenko
9

Impossible d'appeler c'est la meilleure pratique mais c'est ce que nous utilisons déclenché par cron, heureux de voir de meilleures suggestions.

echo "safely removing untagged images"
docker rmi $(docker images | awk '/<none>/{print $3}')

echo "safely removing stopped containers"
docker rm $(docker ps -a -q)

echo "safely removing old containers"
docker ps -a | awk '/weeks ago|months ago|days ago/{print $1}' | xargs --no-run-if-empty docker rm

echo "safely removing old images"
docker images | awk '/weeks ago|months ago|days ago/{print $3}' | xargs --no-run-if-empty docker rmi

echo "safely removing old volumes, custom rebuild of martin/docker-cleanup-volumes image"
docker run -v /var/run/docker.sock:/var/run/docker.sock -v $(readlink -f /var/lib/docker):/var/lib/docker --rm example/docker-cleanup-volumes

echo "native cleanup Docker => 12"
docker system prune -f
rombob
la source
Veuillez ne pas chaîner grep et awk, faites le même filtre juste avant la commande awk `regex {command}`
Tensibai
1
@Tensibai quoi que ce soit pour rendre les sorciers AWK heureux :)
rombob
Juste au cas où, ce n'est pas seulement pédant, vous enregistrez le processus d'apparition et un grand nombre de changements de contexte :) Cela ne change pas grand-chose ici, mais toute occasion de le défendre est bonne :)
Tensibai
@Tensibai définitivement, les bonnes habitudes sont payantes avec le temps, les pontes nous coûtent du temps et de l'argent :)
rombob
Surtout lorsque vous analysez / formatez des fichiers journaux de milliards de lignes pour préparer l'entrée R :) Ici, je ne m'attends pas à plus de quelques dizaines de lignes.
Tensibai
4

Sur ma machine locale (mac) j'ai un petit script que j'ai trouvé que je lance périodiquement qui nettoie toutes les images en excès clean-docker-for-mac.sh

Pour mes serveurs, j'exécute meltwater / docker-cleanup qui nettoie périodiquement les conteneurs sortis et supprime les images et les volumes qui ne sont pas utilisés.

J'utilise beaucoup d'images Docker différentes pour mon travail sur Codemason que des scripts comme ceux-ci sont nécessaires pour moi. Prendre plaisir!

bmagg
la source
0

docker system prune --volumes

Est le moyen de le faire depuis la v17. Documents ici

Mbrevda
la source