Plusieurs choses se passent ici :
Tout d'abord, docker commit
est une odeur de code. Il a tendance à être utilisé par ceux qui créent des images avec un processus manuel, plutôt que d'automatiser leurs versions avec un Dockerfile qui permettrait une recréation facile. Si possible, je vous recommande de passer à un Dockerfile pour la création de votre image.
Ensuite, un docker commit
ne capturera pas les modifications apportées à un volume. Et ce même problème se produit si vous essayez de mettre à jour un volume avec un RUN
étape dans un Dockerfile. Ces deux capturent les modifications apportées au système de fichiers du conteneur et stockent ces modifications sous forme de couche dans l'image Docker, et les volumes ne font pas partie du système de fichiers du conteneur. Ceci est également visible si vous exécutez docker diff
contre un conteneur. Dans ce cas, l'image en amont a défini le volume dans son Dockerfile :
VOLUME /var/lib/mysql
Et docker n'a pas de commande pour annuler un volume créé à partir du Dockerfile. Vous devrez soit modifier directement la définition de l'image depuis l'extérieur du docker (non recommandé), soit créer votre propre image en amont en supprimant cette étape (recommandé).
Ce que l'image mysql fournit, c'est la possibilité d'injecter vos propres scripts de création de base de données dans /docker-entrypoint-initdb.d
, que vous pouvez ajouter avec votre propre image qui étend mysql, ou monter en tant que volume. C'est là que vous injecterez votre schéma ou initialiserez à partir d'une sauvegarde connue pour le développement.
Enfin, si l'objectif est d'avoir de la persistance, vous devez stocker vos données dans un volume, et non en commitant des conteneurs :
docker run -v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
Le volume vous permet de recréer le conteneur, de mettre à niveau vers une version plus récente de mysql lorsque des correctifs sont publiés (par exemple, des correctifs de sécurité) sans perdre vos données.
Pour sauvegarder le volume, cela exportera vers un tgz :
docker run --rm -v mysql-data:/source busybox tar -cC /source . >backup.tgz
Et pour restaurer un volume, ceci en crée un à partir d'un tgz :
docker run --rm -i -v mysql-data:/target busybox tar -xC /target <backup.tgz