Comment créer une image Docker à partir d’un conteneur en cours d’exécution – CloudSavvy IT
Les conteneurs Docker sont généralement des instances d’application éphémères qui n’ont pas d’état interne. C’est la meilleure façon de les gérer qui vous permet d’arrêter ou de redémarrer vos conteneurs à tout moment.
Parfois, les modifications du système de fichiers d’un conteneur sont inévitables. Peut-être essayez-vous un logiciel et souhaitez-vous revenir plus tard sur un instantané. Un autre cas d’utilisation pourrait être des situations où le logiciel à l’intérieur d’un conteneur a cessé de fonctionner et que vous souhaitez enregistrer une réplique que vous pourrez déboguer à l’avenir.
Voici comment créer une nouvelle image Docker à partir d’un conteneur existant. Vous pourrez alors commencer une autre conteneur de cette image qui sera rempli avec le système de fichiers du premier.
Sommaire
Commettre des conteneurs
le docker commit
La commande est utilisée pour prendre un conteneur et produire une nouvelle image à partir de celui-ci. Cela fonctionne avec des conteneurs arrêtés ou en cours d’exécution.
La syntaxe de base est la suivante :
docker commit example-container example-image:latest
Cela crée une image à partir du conteneur nommé example-container
. Vous pouvez également identifier le conteneur par ID si vous préférez. Les deux informations sont disponibles à partir de la sortie de docker ps
qui répertorie tous les conteneurs sur votre hôte.
L’image résultante se voit attribuer la balise donnée comme deuxième paramètre de la commande. C’est example-image:latest
dans l’exemple ci-dessus. Tout comme une opération de marquage d’image classique, la nouvelle image remplacera la référence du tag si elle existe déjà.
Vous pouvez maintenant utiliser votre image pour restaurer le système de fichiers à partir de example-container
dans une nouvelle instance de conteneur :
docker run -d example-image:latest
Le contenu du système de fichiers correspondra au example-container
conteneur au moment où le docker commit
La commande a été exécutée Il y a une mise en garde importante : le contenu des volumes montés ne sera pas inclus, de sorte que leurs emplacements de montage seront vides dans l’image de conteneur créée. Pour exécuter un nouveau conteneur avec des données de volume intactes, utilisez le -v
flag pour rattacher les volumes du premier conteneur lorsque vous démarrez la deuxième instance avec docker run
.
Un autre point d’achoppement notable est la façon dont Docker gère les validations des conteneurs en cours d’exécution. Pour la plupart, cela devrait fonctionner de manière transparente, mais par défaut, il met en pause le conteneur cible avant la création du commit. Tous les processus du conteneur seront suspendus puis repris une fois la création de l’image terminée. Cela améliore la cohérence des données dans la nouvelle image mais laisse le conteneur momentanément inaccessible. Vous pouvez désactiver ce comportement en incluant --pause false
avec votre docker commit
commander.
Ajout de messages de validation
le docker commit
La commande prend en charge les messages de validation de la même manière que les logiciels de contrôle de version tels que Git. L’ajout d’un message lorsque vous créez une image à partir d’un conteneur vous permet de documenter ce qui a changé et la raison de votre validation.
Utilisez le --message
ou -m
drapeau pour appliquer un message de validation :
docker commit -m "Example commit" example-container example-image:latest
Vous pouvez également ajouter des informations sur l’auteur avec un indicateur dédié. Fournissez une chaîne dans le commun First Name <email@example.com>
formater au --author
ou -a
drapeau. Il sera enregistré avec le message de validation.
docker commit -a "Example Author <example@example.com>" -m "Example commit" example-container example-image:latest
Les messages de validation s’affichent lorsque vous utilisez le docker history
commande pour afficher les calques dans une image. Ils apparaîtront dans le COMMENT
colonne à l’extrême droite.
Une autre façon d’accéder à ces informations est d’utiliser docker inspect
en tandem avec grep
pour extraire les valeurs d’auteur et de commentaire de la représentation JSON d’une image :
docker inspect <image-id> | grep 'Created|Author|Comment'
Cela affichera les données associées à la couche supérieure de l’image.
Modification des instructions Dockerfile
La validation d’une image vous donne la possibilité de muter certaines de ses instructions Dockerfile. Vous pouvez remplacer les valeurs suivantes dans votre nouvelle image :
CMD
ENTRYPOINT
ENV
EXPOSE
LABEL
ONBUILD
USER
VOLUME
WORKDIR
Pour définir une instruction, utilisez les --change
ou -c
drapeau:
docker commit --change 'ENTRYPOINT ["sh"]' example-container example-image:latest
Vous pouvez répéter l’indicateur autant de fois que nécessaire pour appliquer toutes les modifications souhaitées.
Seules les instructions qui ont un impact sur la couche supérieure du système de fichiers sont prises en charge. Vous ne pouvez pas étendre de manière transparente une image validée avec de nouvelles couches via des instructions telles que RUN
et COPY
. Cependant, vous pouvez prendre le résultat d’un commit et écrire un nouveau Dockerfile qui ajoute du nouveau contenu si nécessaire :
# Created via `docker commit` FROM example-image:latest RUN apt install example-package
Si vous modifiez les instructions Dockerfile au moment de la validation, cela vaut la peine d’ajouter un message de validation qui explique ce que vous modifiez et pourquoi. Cela aidera toute autre personne ayant accès à l’image à comprendre les différences de comportement par rapport au conteneur à partir duquel elle a été créée.
Résumé
Les images Docker sont généralement construites à partir de Dockerfiles et utilisées pour démarrer des conteneurs jetables. Les modifications de l’état du système de fichiers d’un conteneur sont effectuées en reconstruisant l’image, en détruisant le conteneur existant et en en démarrant un nouveau. Dans un monde idéal, les conteneurs n’ont pas d’état interne, mais ce n’est pas toujours vrai dans la pratique.
La validation d’un conteneur vous permet de restaurer son système de fichiers actuel à l’avenir. Les validations sont utiles pour créer des répliques de conteneurs gênants afin que vous puissiez déboguer dans un environnement séparé tout en conservant l’accès aux journaux et aux fichiers temporaires générés précédemment.
Bien que les commits de conteneur ressemblent souvent aux instantanés de VM, ils ne sont pas tout à fait la même chose. Les machines virtuelles contrôlent le matériel virtuel et l’état de ce matériel sera présent dans l’instantané. Les conteneurs Docker ne sont qu’un ensemble de processus exécutés sur l’hôte ; un commit est une nouvelle image Docker qui représente le conteneur système de fichiers mais il manque nécessairement des données sur l’état des processus, le noyau et votre matériel.