virli/tutorial/dockerfiles/interactive.md

114 lines
3.5 KiB
Markdown
Raw Normal View History

Modification interactive
2021-09-23 00:55:18 +00:00
------------------------
2021-09-23 00:55:18 +00:00
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
2021-09-23 00:55:18 +00:00
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
2021-09-23 00:55:18 +00:00
pas inclus dans le conteneur.
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
apt-get update
```
2017-10-17 06:29:07 +00:00
</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,
2021-09-24 15:12:07 +00:00
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.
2021-09-23 00:55:18 +00:00
[^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
2021-09-24 15:12:07 +00:00
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.\
2021-09-24 15:12:07 +00:00
La liste des paquets récupérés, installons maintenant un programme : notre
première image pourrait contenir notre éditeur de texte favori :
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
apt-get install nano
```
2017-10-17 06:29:07 +00:00
</div>
Lorsque l'installation de `nano` est terminée, quittons l'image en tapant
2021-09-24 15:12:07 +00:00
`exit`.\
2021-09-24 15:12:07 +00:00
Nous allons sauvegarder nos modifications en tant que nouvelle image Docker,
avec la commande `commit` :
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
docker container commit CONTAINER my_nano
```
2017-10-17 06:29:07 +00:00
</div>
2018-10-18 05:05:36 +00:00
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`.
2020-09-14 13:46:13 +00:00
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)
2021-09-23 00:55:18 +00:00
Testons alors sans plus attendre notre nouvelle image :
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
docker container run -it my_nano /bin/bash
```
2017-10-17 06:29:07 +00:00
</div>
Vous constatez cette fois que vous pouvez lancer `nano`, alors que vous ne
2017-10-16 20:59:22 +00:00
pouvez toujours pas le faire dans un conteneur issu d'une image `ubuntu` !
2020-10-28 22:16:34 +00:00
2021-09-23 00:55:18 +00:00
### Scripté ?
2020-10-28 22:16:34 +00:00
2021-09-23 00:55:18 +00:00
On peut automatiser les étapes ci-dessus avec un script qui ressemblerait à ça :
2020-10-28 22:16:34 +00:00
<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>
2021-09-23 00:55:18 +00:00
On obtiendra de la même manière notre image `my_nano` :
2020-10-28 22:16:34 +00:00
<div lang="en-US">
```bash
docker container run -it my_nano /bin/bash
```
</div>
2021-09-24 15:12:07 +00:00
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`.