::::: {.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 ; 1. mette à jour le contneur ; 1. dans un conteneur, automatiquement pour toutes les images. ## É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 {-}
```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 ```
## É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 utilisant les bonnes pratiques vues en cours. ### Exemple d'exécution {-}
```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 ```
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. ::::: {.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. Lors de l'affichage de la liste des conteneurs, sauter le conteneur dont le début de l'identifiant commence par le `hostname(1)`. Le comportement est indéfini si l'on passe le nom de notre propre conteneur en argument, pour les étapes suivantes. ::::: ## É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 {-}
```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. ```
N'hésitez pas à utiliser la sortie d'erreur et la sortie standard pour afficher des informations pour vous. Celles-ci ne seront pas vérifiées. ::::: {.warning} #### Qu'est-ce qu'une image à jour ? {-} Attention, on souhaite rester sur le même tag que celui avec lequel on a 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 chercher s'il y a une mise à jour pour l'image `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. 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. ::::: ## Étape 3 : Chercher une mise à jour l'image En ajoutant l'option `--pull`, votre programme va lancer un pull de l'image avant de faire la vérification.
```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 ```
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. Attention une fois l'image *pull* par `ctr-updater`, un appel à nouveau à `ctr-updater` sans `--pull` retourne la mise à jour, car le `pull` précédent aura téléchargé localement l'image. ::::: {.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.
```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 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 ```
::::: ## É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. ### Exemples d'exécution {-}
```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 ```
```bash 42sh$ docker run -d --name myp0m nemunaire/youp0m 42sh$ ctr-updater --pull --autoupdate myp0m ```
:::::