Comment créer une image Docker à partir d'un conteneur en cours d'exécution

0
191

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 ultérieurement 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 ultérieurement.

Voici comment créer une nouvelle image Docker à partir d'un conteneur existant. Vous pourrez alors démarrer un autre conteneur à partir de cette image qui sera rempli avec le système de fichiers du premier.

Committing Containers

La commande docker commit est utilisée pour prendre un conteneur et produire une nouvelle image à partir de celui-ci. Il fonctionne avec les 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.

Publicité

L'image résultante se voit attribuer la balise donnée comme deuxième paramètre de la commande. Ceci est example-image:latest dans l'exemple ci-dessus. Tout comme une opération de marquage d'image standard, 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 depuis example-container dans une nouvelle instance de conteneur :

docker run -d example-image:latest

Le contenu du système de fichiers correspondra au conteneur example-container au moment où la commande docker commit 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 l'indicateur -v 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 commande docker commit.

Ajout de messages de validation

La commande docker commit prend en charge les messages de validation de la même manière qu'un logiciel de contrôle de version comme 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 l'indicateur –message ou -m pour appliquer un message de validation :< /p>docker commit -m “Example commit” example-container example-image:latest Advertisement

Vous pouvez également ajouter des informations sur l'auteur avec un indicateur dédié. Fournissez une chaîne dans le prénom commun <email@example.com> format au drapeau –author ou -a. 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 la commande docker history pour afficher les calques d'une image. Ils apparaîtront dans la colonne COMMENTAIRE à l'extrême droite.

Une autre façon d'accéder à ces informations consiste à 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 'Créé|Auteur|Commentaire'

Cela affichera les données associées à la couche la plus haute de l'image.

Modification des instructions Dockerfile

La validation d'une image vous donne une chance 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 l'indicateur –change ou -c :

docker commit –change 'ENTRYPOINT [“sh”]' example-container example-image:latest Advertisement

Vous pouvez répéter le drapeau 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 nouveaux calques 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 :

# Créé via `docker commit` FROM example-image:latest RUN apt install example-package

Si vous le faites modifier 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 précédemment générés.

Bien que les validations de conteneur ressemblent souvent à des instantanés de VM, elles ne sont pas & #8217; c'est 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 système de fichiers du conteneur mais qui manque nécessairement de données sur l'état des processus, le noyau et votre matériel.