virli/tutorial/dockerfiles/interactive.md

3.5 KiB

Modification interactive

Pour créer une image, commençons par entrer dans un nouveau conteneur :

```bash docker container run -it ubuntu /bin/bash ```

Nous voilà maintenant dans le conteneur ! Il est assez épuré, il n'y a rien de superflu : même pas d'éditeur de texte : ni vim, ni emacs, même pas vi !

La première chose à faire est de télécharger la liste des paquets. En effet, afin de ne pas livrer de superflu, la liste des paquets et son cache ne sont pas inclus dans le conteneur.

```bash apt-get update ```

Il peut arriver que des paquets présents dans l'image ne soient pas à jour. De manière générale, il n'est pas recommandé de faire de mises à jour automatiques et systématiques des éléments présents dans l'image, à l'exception des mises à jour de sécurité1. En effet, une mise à jour qui apporte des changements peut altérer le comportement du conteneur, en fonction de la date à laquelle on le construit. Car on ne sait pas d'avance quelles versions de nos dépendances on va récupérer.

Si vous souhaitez disposez d'une nouvelle version de l'image, il est plutôt recommandé de contacter le mainteneur de l'image pour qu'il la mette à jour, en utilisant un nouveau tag s'il le juge nécessaire. Si cette solution n'est pas envisageable, alors il vaut mieux créer votre propre image, à partir de l'image de base : vous serez alors vous-même responsable de la bonne continuité de construction des images issues de votre image, sans que cela soit hasardeux au moment de la construction.\

La liste des paquets récupérés, installons maintenant un programme : notre première image pourrait contenir notre éditeur de texte favori :

```bash apt-get install nano ```

Lorsque l'installation de nano est terminée, quittons l'image en tapant exit.\

Nous allons sauvegarder nos modifications en tant que nouvelle image Docker, avec la commande commit :

```bash docker container commit CONTAINER my_nano ```

en remplaçant CONTAINER par le nom ou l'identifiant du container qui doit servir de modèle. my_nano est le nom que vous voudrez utiliser à la place d'ubuntu.

Cette action va figer la couche la plus haute de systèmes de fichiers, qui était jusqu'alors en lecture-écriture pour le conteneur ; afin d'en faire la dernière couche de notre nouvelle image.

docker commit

Testons alors sans plus attendre notre nouvelle image :

```bash docker container run -it my_nano /bin/bash ```

Vous constatez cette fois que vous pouvez lancer nano, alors que vous ne pouvez toujours pas le faire dans un conteneur issu d'une image ubuntu !

Scripté ?

On peut automatiser les étapes ci-dessus avec un script qui ressemblerait à ça :

```bash docker container run ubuntu apt-get update docker container commit $(docker container ls -lq) my_nano_step-1 docker container run my_nano_step-1 apt-get install nano docker container commit $(docker container ls -lq) my_nano ```

On obtiendra de la même manière notre image my_nano :

```bash docker container run -it my_nano /bin/bash ```

contenant notre éditeur de texte favori.\

On ne va pas réaliser ce script ni l'étoffer, car il existe justement un mécanisme de construction d'image : le Dockerfile.