2022-09-20 04:02:53 +00:00
|
|
|
|
::::: {.exercice}
|
|
|
|
|
|
|
|
|
|
Écrivez un programme tirant parti de l'API du Docker Engine (le *daemon*
|
|
|
|
|
Docker) qui pour un conteneur donné :
|
|
|
|
|
|
|
|
|
|
1. détecte si le conteneur exécute une image disposant d'une mise à jour ;
|
|
|
|
|
1. cherche à récupérer la dernière image disponible ;
|
2023-01-02 17:25:05 +00:00
|
|
|
|
1. met à jour le conteneur.
|
|
|
|
|
|
|
|
|
|
Enfin, pour simplifier son utilisation régulière, vous conceverez une image de
|
|
|
|
|
conteneur minimaliste.
|
2022-09-20 04:02:53 +00:00
|
|
|
|
|
|
|
|
|
## Étape 1 : Lister les conteneurs
|
|
|
|
|
|
|
|
|
|
Lancé sans argument, votre programme doit retourner la liste des conteneurs
|
|
|
|
|
actifs. Un nom par ligne.
|
|
|
|
|
|
|
|
|
|
### Exemple d'exécution {-}
|
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
42sh$ docker run -d nginx
|
|
|
|
|
42sh$ docker run -d mysql
|
|
|
|
|
42sh$ docker run -d redis
|
|
|
|
|
42sh$ ctr-updater
|
|
|
|
|
Choose a container to analyze:
|
|
|
|
|
dazzling_driscoll
|
|
|
|
|
amazing_proskuriakova
|
|
|
|
|
optimistic_meninsky
|
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Étape 1 bis : Prêt pour la prod
|
|
|
|
|
|
|
|
|
|
Écrivez un `Dockerfile` pour conteneuriser ce programme : gérer tant la
|
|
|
|
|
construction (s'il y a des étapes de construction) que l'exécution. En
|
2023-01-02 17:25:05 +00:00
|
|
|
|
utilisant les bonnes pratiques que nous avons pu voir.
|
2022-09-20 04:02:53 +00:00
|
|
|
|
|
|
|
|
|
### Exemple d'exécution {-}
|
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
42sh$ docker run -d --name myp0m nemunaire/youp0m
|
|
|
|
|
42sh$ docker build -t login/ctr-updater .
|
|
|
|
|
42sh$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock login/ctr-updater
|
|
|
|
|
Choose a container to analyze:
|
|
|
|
|
myp0m
|
|
|
|
|
|
|
|
|
|
# Après l'étape 2 :
|
|
|
|
|
42sh$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock login/ctr-updater myp0m
|
|
|
|
|
42sh$ echo $?
|
|
|
|
|
0 # Le conteneur est à jour
|
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
Notez que l'on n'emploie pas `ctr-updater` pour appeler le binaire dans
|
|
|
|
|
l'image. Le premier argument passé au conteneur est donc le nom du conteneur à
|
|
|
|
|
vérifier.
|
|
|
|
|
|
2022-09-28 13:49:13 +00:00
|
|
|
|
::::: {.question}
|
|
|
|
|
|
|
|
|
|
#### Afficher ou ne pas afficher le conteneur courant dans la liste ? {-}
|
|
|
|
|
|
|
|
|
|
On remarque que dans l'exemple, on lance un conteneur `youp0m` puis un
|
|
|
|
|
conteneur `login/ctr-updater`, mais pourtant `ctr-updater` n'affiche qu'un seul
|
|
|
|
|
conteneur.
|
|
|
|
|
|
|
|
|
|
Étant donné que l'on ne pourra pas mettre à jour le conteneur courant
|
|
|
|
|
automatiquement, puisque c'est lui qui stope puis relance les conteneurs, on ne
|
|
|
|
|
le propose pas dans la liste.
|
|
|
|
|
|
2022-10-08 12:13:15 +00:00
|
|
|
|
Lors de l'affichage de la liste des conteneurs, sautez le conteneur dont le
|
2022-10-13 15:22:23 +00:00
|
|
|
|
début de l'identifiant commence par le nom d'hôte du conteneur courant
|
|
|
|
|
(`hostname(1)`).
|
2022-09-28 13:49:13 +00:00
|
|
|
|
|
2022-10-08 12:13:15 +00:00
|
|
|
|
Le comportement est indéfini si on passe le nom de notre propre conteneur en
|
2022-09-28 13:49:13 +00:00
|
|
|
|
argument, pour les étapes suivantes.
|
|
|
|
|
|
|
|
|
|
:::::
|
|
|
|
|
|
2022-09-20 04:02:53 +00:00
|
|
|
|
|
|
|
|
|
## Étape 2 : Détecter si le conteneur exécute la dernière image disponible
|
|
|
|
|
|
|
|
|
|
Lancé avec un argument, votre programme doit, à partir des informations
|
|
|
|
|
accessibles localement (conteneurs et images), retourner le code de 0 ou 1,
|
|
|
|
|
suivant si (0) aucune mise à jour de l'image n'est disponible, respectivement
|
|
|
|
|
(1) une mise à jour est disponible.
|
|
|
|
|
|
|
|
|
|
### Exemple d'exécution {-}
|
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
42sh$ docker build -t my_webserver .
|
|
|
|
|
42sh$ docker run -d --name mws my_webserver
|
|
|
|
|
42sh$ ctr-updater mws
|
|
|
|
|
42sh$ echo $?
|
|
|
|
|
0 # Le conteneur est à jour
|
|
|
|
|
|
|
|
|
|
42sh$ echo "nouvelle page" > index.html
|
|
|
|
|
42sh$ docker build -t my_webserver .
|
|
|
|
|
42sh$ ctr-updater mws
|
|
|
|
|
42sh$ echo $?
|
|
|
|
|
1 # Une mise à jour est dispo.
|
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
N'hésitez pas à utiliser la sortie d'erreur et la sortie standard pour afficher
|
2023-01-02 17:25:05 +00:00
|
|
|
|
des informations de débogage pour vous.
|
2022-09-20 04:02:53 +00:00
|
|
|
|
|
2022-09-28 13:49:13 +00:00
|
|
|
|
::::: {.warning}
|
|
|
|
|
|
|
|
|
|
#### Qu'est-ce qu'une image à jour ? {-}
|
|
|
|
|
|
2022-09-30 09:38:31 +00:00
|
|
|
|
Par *image à jour*, on entend : « aligné par rapport à l'image du
|
|
|
|
|
registre ». On ne s'intéresse pas à la date de construction ou de récupération
|
2023-01-02 17:25:05 +00:00
|
|
|
|
de l'image, mais uniquement à son identifiant. En bref : si l'image sur
|
|
|
|
|
laquelle se base un conteneur en cours d'exécution n'a pas le même identifiant
|
|
|
|
|
que l'image du même tag dans le cache d'images, alors on considère que le
|
|
|
|
|
conteneur doit être redémarré (même si la construction ou la récupération est
|
|
|
|
|
antérieure).\
|
2022-09-30 09:38:31 +00:00
|
|
|
|
|
|
|
|
|
Attention, on souhaite rester sur **le même tag** que celui avec lequel on a
|
2022-09-28 13:49:13 +00:00
|
|
|
|
démarré le conteneur. Il ne s'agit pas de trouver un tag plus récent.
|
|
|
|
|
|
|
|
|
|
Par exemple, si on a lancé un conteneur à partir de l'image `mariadb:10`, on va
|
2022-09-30 09:38:31 +00:00
|
|
|
|
chercher s'il y a une image différente pour le tag `mariadb:10` sur le
|
|
|
|
|
registre. Il n'est pas question d'aller parcourir la liste des tags pour voir
|
|
|
|
|
si oui ou non le tag est bien le dernier.
|
2022-09-28 13:49:13 +00:00
|
|
|
|
|
|
|
|
|
Si on a lancé un conteneur à partir de l'image `python:3.9`, il n'est pas
|
|
|
|
|
question de passer sur `python:3` ou `python:3.11`. Dans le cas de `latest`, on
|
|
|
|
|
cherche également à se maintenir à jour par rapport à `latest`, nécessairement
|
|
|
|
|
plus souvent que les autres tags.
|
|
|
|
|
|
|
|
|
|
:::::
|
|
|
|
|
|
2022-09-20 04:02:53 +00:00
|
|
|
|
|
|
|
|
|
## Étape 3 : Chercher une mise à jour l'image
|
|
|
|
|
|
2023-01-02 17:25:05 +00:00
|
|
|
|
En ajoutant l'option `--pull`, votre programme va lancer un *pull* de l'image
|
2022-09-20 04:02:53 +00:00
|
|
|
|
avant de faire la vérification.
|
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
42sh$ docker run -d --name myp0m nemunaire/youp0m
|
|
|
|
|
42sh$ ctr-updater myp0m
|
|
|
|
|
42sh$ echo $?
|
|
|
|
|
0 # Le conteneur est à jour
|
|
|
|
|
42sh$ ctr-updater --pull myp0m
|
|
|
|
|
42sh$ echo $?
|
|
|
|
|
1 # Une mise à jour est dispo.
|
|
|
|
|
42sh$ ctr-updater myp0m
|
|
|
|
|
42sh$ echo $?
|
|
|
|
|
1 # La nouvelle image a été pull précédemment
|
|
|
|
|
# et est disponible dans le cache local
|
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
2023-01-02 17:25:05 +00:00
|
|
|
|
::::: {.question}
|
|
|
|
|
|
2022-09-20 04:02:53 +00:00
|
|
|
|
L'image `youp0m` est mise à jour régulièrement. Il y a de forte chance pour
|
|
|
|
|
qu'elle ne soit plus à jour si celle dont vous disposez date de plus d'une
|
|
|
|
|
semaine. Si vous possédez déjà la dernière version de vos conteneurs,
|
|
|
|
|
recherchez une image sur le Docker Hub régulièrement mise à jour pour faire vos
|
|
|
|
|
tests.
|
|
|
|
|
|
2023-01-02 17:25:05 +00:00
|
|
|
|
:::::
|
|
|
|
|
|
|
|
|
|
::::: {.warning}
|
|
|
|
|
|
|
|
|
|
Une fois l'image *pull* par `ctr-updater`, un nouvel appel à `ctr-updater` sans
|
|
|
|
|
`--pull` indiquera qu'une mise à jour est disponible, car le `pull` précédent
|
2022-09-20 04:02:53 +00:00
|
|
|
|
aura téléchargé localement l'image.
|
|
|
|
|
|
2023-01-02 17:25:05 +00:00
|
|
|
|
:::::
|
|
|
|
|
|
2022-09-30 09:30:37 +00:00
|
|
|
|
::::: {.question}
|
|
|
|
|
|
|
|
|
|
#### Comment tester lorsqu'on a `pull` toutes ses images ? {-}
|
|
|
|
|
|
|
|
|
|
Toutes les images persistent tant que vous ne les supprimez pas (via `docker
|
|
|
|
|
image rm` ou `docker image prune`). Vous pouvez alors réattribuer manuellement
|
|
|
|
|
son ancien tag à l'image précédente.
|
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
42sh$ docker image ls -f reference=nemunaire/youp0m
|
|
|
|
|
REPOSITORY TAG IMAGE ID CREATED SIZE
|
|
|
|
|
nemunaire/youp0m latest aafb58fb6a2d 5 days ago 25.1MB
|
|
|
|
|
nemunaire/youp0m <none> 2c06880e48aa 3 weeks ago 25MB
|
|
|
|
|
42sh$ docker image tag 2c06880e48aa nemunaire/youp0m:latest
|
|
|
|
|
|
|
|
|
|
[...] # Considérant les commandes de l'exemple précédent
|
|
|
|
|
42sh$ ctr-updater myp0m
|
|
|
|
|
42sh$ echo $?
|
|
|
|
|
0 # Le conteneur est à nouveau à jour
|
|
|
|
|
# On peut retenter de pull
|
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
:::::
|
|
|
|
|
|
2022-09-20 04:02:53 +00:00
|
|
|
|
|
|
|
|
|
## Étape 4 : Mettre à jour le conteneur
|
|
|
|
|
|
|
|
|
|
En ajoutant l'option `--autoupdate`, si une mise à jour de l'image utilisée par
|
|
|
|
|
le conteneur est disponible (après un éventuel `pull` si l'option est passée),
|
|
|
|
|
le conteneur est arrêté, supprimé, puis relancé avec les mêmes options, mais en
|
|
|
|
|
utilisant la nouvelle image.
|
|
|
|
|
|
|
|
|
|
Il est attendu dans ce cas de toujours retourner le statut 0 si la mise à jour
|
|
|
|
|
se passe bien.
|
|
|
|
|
|
2022-09-28 13:49:13 +00:00
|
|
|
|
### Exemples d'exécution {-}
|
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
42sh$ docker build -t my_webserver .
|
|
|
|
|
42sh$ docker run -d --name mws my_webserver
|
|
|
|
|
42sh$ echo "nouvelle page" > index.html
|
|
|
|
|
42sh$ docker build -t my_webserver .
|
|
|
|
|
42sh$ ctr-updater mws
|
|
|
|
|
42sh$ echo $?
|
|
|
|
|
1 # Une mise à jour est dispo.
|
|
|
|
|
|
|
|
|
|
42sh$ ctr-updater --autoupdate mws
|
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
42sh$ docker run -d --name myp0m nemunaire/youp0m
|
|
|
|
|
42sh$ ctr-updater --pull --autoupdate myp0m
|
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
2022-09-20 04:02:53 +00:00
|
|
|
|
:::::
|