Skip to content

Calculer le hash d'un répertoire

Auteur : Philippe Le Van - @plv@framapiaf.org

Date : 8 décembre 2022

Cas d'usage

Pour éviter de rebuilder une image docker à chaque push de mon repository, je fais un hash des fichiers et répertoires qui peuvent avoir une influence sur mon image docker, puis je tague mon image avec ce hash.

Ensuite avant de rebuilder mon image, je teste l'existence de mon image avec le tag concerné. Si elle existe déjà, je ne rebuilde pas.

Calculer le hash d'un répertoire

La méthode la plus simple que j'ai trouvée, c'est de faire un tar du répertoire, puis de calculer le hash du tar.

Cas de base

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
tar \
  --sort=name \
  --owner=root:0 \
  --group=root:0 \
  --mtime='2020-01-01 00:00:00' \
  -cvf - . | sha1sum

# avec cette fonction, on impose les owners de
# fichier, la date de modification des fichiers 
# et l'ordre des fichiers dans le tar. 

=> résultat : 
e6206955ee7d3879baa4db30274169540e7bde29  -

Ensuite, il faut virer le "-" à la fin du hash.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
tar \
  --sort=name \
  --owner=root:0 \
  --group=root:0 \
  --mtime='2020-01-01 00:00:00' \
  -cvf - . | sha1sum | cut -f 1 -d " "

# notes sur le cut :
# -f 1 : on prend le premier champ
# -d " " : le séparateur est l'espace

si je veux exclure des fichiers

On peut utiliser les fonctions d'exclusion de tar

1
2
3
4
5
6
7
8
tar \
  --sort=name \
  --owner=root:0 \
  --group=root:0 \
  --mtime='2020-01-01 00:00:00' \
  --exclude="README.*" -cvf - . | sha1sum | cut -f 1 -d " "

#  warning : le --exclude doit être avant le -cvf

Commande moins verbeuse

Là le tar prend l'option -cvf. Le "v" permet ici de dire que l'on veut afficher tous les fichiers que l'on prend en compte dans le hash. C'est pratique pour le debug, mais on peut l'enlever et utiliser -cf à la place de -cvf.

Si je veux changer de fonction de hashage

On peut utiliser la commande sha256sum ou md5sum à la place de sha1sum