virli/tutorial/dockerfiles/interactive.md

106 lines
2.9 KiB
Markdown

\newpage
Modification interactive
========================
Pour créer une image, commençons par entrer dans un nouveau conteneur :
<div lang="en-US">
```bash
docker container run -it ubuntu /bin/bash
```
</div>
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 incluses dans le conteneur.
<div lang="en-US">
```bash
apt-get update
```
</div>
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é[^SECURITY_UPDATE]. 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.
[^SECURITY_UPDATE]: Voir cet article :
<https://pythonspeed.com/articles/security-updates-in-docker/>
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.
Installons maintenant un programme :
<div lang="en-US">
```bash
apt-get install nano
```
</div>
Lorsque l'installation de `nano` est terminée, quittons l'image en tapant
`exit`.
Sauvegardons nos modifications en tant que nouvelle image Docker, avec
la commande `commit` :
<div lang="en-US">
```bash
docker container commit CONTAINER my_nano
```
</div>
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`](commit.png)
Testons alors sans plus attendre notre nouvelle image :
<div lang="en-US">
```bash
docker container run -it my_nano /bin/bash
```
</div>
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 :
<div lang="en-US">
```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
```
</div>
On obtiendra de la même manière notre image `my_nano` :
<div lang="en-US">
```bash
docker container run -it my_nano /bin/bash
```
</div>
Contenant notre éditeur de texte favori.