Aller au contenu principal

Docker Commit ou Dockerfile ?

· 3 minutes de lecture
Lucas Sovre
Software architect, Docker certified expert, cloud and devsecops .

Connaissez-vous la deuxième commande qui permet de créer des images docker ? 🐳

Docker commit [nom du container] [nom de image]:[tag]

Cette commande permet de créer une image en faisant une sorte de "snapshot" du container ciblé. Mais, je me demandais quelles sont les différences avec docker build (mis à part le Dockerfile) ?

J'ai pris du temps pour étudier un cas très simple et regarder les différences que cela produit :

Les différences entre docker commit et docker build :

Les deux commandes docker commit et docker build permettent de créer des images docker. Mais docker commit permet de la créer à partir d'un container existant et docker build permet de la créer à partir d'un Dockerfile .

Protocole de test de comparaison de docker commit et docker build :

  1. Construire une image nginx:1.24.0 à laquelle on ajoute le paquet iputils-ping .
  2. Faire cet ajout en une seule ligne de commande.

Le Dockerfile :

FROM nginx:1.24.0

RUN apt update && apt install iputils-ping -y

Dans ce cas on observe une différence de 1254 Octets, soit envion 0.0001mb.

Les poids exacts des images sont de :

  • 155 182 582 octets pour le docker build
  • 155 183 836 octets pour le docker commit

Différences d'attributs

Si la taille des images n'a que très peu changé, les attributs eux sont radicalement modifiés :

L'image créée avec docker build à perdu les attributs suivants :

  • Cmd
  • EntryPoint
  • Env
  • Labels
  • Exposed ports
  • Stop signal
  • Docker version
  • Parent

Conclusion des différences entre docker commit et docker build :

Il n'y a pas de meilleure solution, elles ont juste des buts différents :

Docker commit devrait surtout être utilisé pour customiser une image docker pour simplifier l'utilisation de celle-ci par la suite.

Exemple :

Ajouter un paquet, modifier rapidement une image à des fins de test...

Docker build devrait être utilisé quand on crée un nouveau cas d'utilisation et notamment que l'on souhaite garder une version scriptée de son image sous forme de Dockerfile. Ce qui est bien plus pérenne qu'une image stockée dans un registry.

Les sources de mon expérience et toute ma démarche sont disponibles sur ce repos : https://github.com/LucasSovre/sourcesCommitVsBuild/tree/main

Normalement cela ne devrait rien changer à la mécanique étudiée, mais les tests ont été faits avec un processeur ARM (m1)

Sources