C’est une bonne pratique de mettre à jour le logiciel, en particulier lorsque vous obtenez de nouvelles fonctionnalités et/ou une sécurité accrue dans les nouvelles mises à jour.

Dans cet article, je vais vous montrer comment activer les mises à jour automatiques pour les conteneurs gérés par Podman.

À des fins de démonstration, j’utiliserai le caddy image de Hub Docker.

Déterminer la source pour récupérer l’image

Pour utiliser une image de conteneur, Podman doit extraire cette image de quelque part. Ce « quelque part » est appelé le politique de mise à jour automatique.

Les politiques de mise à jour automatique sont les suivantes :

  • registry: lorsque la stratégie de mise à jour automatique est définie sur la chaîne registryPodman extraira l’image d’un registre distant comme Hub Docker et Quay.io.
  • local: lorsque la stratégie de mise à jour automatique est définie sur la chaîne localPodman récupérera l’image de images construites localement. Cette politique de mise à jour est pratique lorsque vous êtes un développeur et que vous souhaitez tester les modifications locales avant de les transmettre à un registre distant.

✍🏻

J’exécute un conteneur sans racine. J’ai essayé de spécifier des commandes si vous utilisez un conteneur root-full partout où je peux, mais moi étant un humain, cela a peut-être été manqué.

Utilisez simplement le sudo lorsque vous rencontrez une erreur liée aux privilèges (uniquement si vous avez un conteneur root-full).

Activer les mises à jour automatiques

Maintenant que vous savez ce qu’est une “politique de mise à jour automatique”, nous pouvons maintenant poursuivre avec ce didacticiel.

Tout ce que vous devez faire pour activer les mises à jour automatiques pour un conteneur géré par Podman est d’ajouter le libellé suivant :

io.containers.autoupdate=AUTO_UPDATE_POLICY

Remplacer la chaîne AUTO_UPDATE_POLICY soit registry ou avec local et vous êtes prêt à partir !

“Mais comment le conteneur se mettra-t-il à jour automatiquement lorsque Podman n’a pas de démon?”

intégration systemd

Quand j’ai dit que “Vous n’avez qu’à ajouter le io.containers.autoupdate étiquette sur votre contenant », voyez-vous… je menti mal exprimé.

Le conteneur qui doit être automatiquement mis à jour doit être géré par systemd. “Pourquoi me poussez-vous systemd dans la gorge?” Eh bien parce que Podman a une architecture sans démon. Et le conteneur doit être géré en quelque sorte.

Si vous souhaitez que votre conteneur soit démarré automatiquement au démarrage, vous utilisez déjà systemd pour le faire.

Dans l’article lié ci-dessous, j’explique comment vous pouvez intégrer un conteneur Podman – qu’il s’agisse d’un conteneur racine complet ou d’un conteneur sans racine – avec systemd (avec l’intention de le démarrer automatiquement au démarrage également).

Comment démarrer automatiquement les conteneurs Podman ?

Podman est génial mais il ne démarre pas automatiquement les conteneurs après le redémarrage du système. Voici comment résoudre ce problème.

Quoi qu’il en soit, je vais vous donner un aperçu rapide de la gestion des conteneurs Podman à l’aide de systemd.

Étape 0 : créer un conteneur

Assurez-vous que vous disposez d’un conteneur existant. Peu importe si le conteneur est en cours d’exécution ou arrêté.

Vous pouvez vérifier les conteneurs dont vous disposez en exécutant la commande suivante :

podman container list

Pour ce tutoriel, j’ai extrait une ancienne image de Caddy Server (version 2.5.2-alpine) et l’ont renommé en alpine. Renommer cette image aidera à illustrer le processus de mise à jour. Vous pouvez le vérifier vous-même car l’ID d’image de la balise 2.5.2-alpine et alpine sont identiques 😉

À l’aide de cette image, j’ai créé un conteneur nommé prathams-caddy.

Voici à quoi ressemble mon ordinateur :

$ podman images
REPOSITORY               TAG           IMAGE ID      CREATED      SIZE
docker.io/library/caddy  2.5.2-alpine  d83af79bf9e2  2 weeks ago  45.5 MB
docker.io/library/caddy  alpine        d83af79bf9e2  2 weeks ago  45.5 MB

$ podman container list
CONTAINER ID  IMAGE                   COMMAND               CREATED        STATUS            PORTS       NAMES
99d1838dd999  localhost/caddy:alpine  caddy run --confi...  5 seconds ago  Up 6 seconds ago              prathams-caddy

Comme vous pouvez le voir, j’ai un conteneur appelé prathams-caddy et il exécute le caddy image (qui est à une version plus ancienne).

Le conteneur prathams-caddy a été créé avec le label io.containers.autoupdate mis à registry. Si vous avez un conteneur existant sans cette étiquette, ne vous inquiétez pas ; vous n’avez pas besoin de recréer votre conteneur. Cela sera couvert à l’étape suivante.

Étape 1 : Générer un fichier de service systemd pour votre conteneur

Eh bien, pour gérer votre conteneur Podman via systemd, il doit être transformé en service. De manière réaliste, vous voulez que votre conteneur démarre au démarrage et que vous souhaitiez l’arrêter lorsque vous éteignez le système. Il est logique d’exécuter votre conteneur en tant que service systemd.

“Mais n’est-ce pas trop de travail pour écrire un fichier de service systemd pour chaque conteneur que j’ai?” Il est. Et les développeurs de Podman y ont pensé. Le seul travail manuel que vous devez faire est d’exécuter une commande pour chacun de vos conteneurs.

Si tu as un conteneur root-full (un conteneur avec des privilèges root), exécutez la commande suivante :

sudo podman generate systemd -f --new --name CONTAINER_NAME

Si votre conteneur est un conteneur sans racine (un conteneur sans privilèges root), exécutez la commande suivante :

podman generate systemd -f --new --name CONTAINER_NAME

Remplacer la chaîne CONTAINER_NAME avec le nom de votre conteneur et un fichier avec le nom container-CONTAINER_NAME.service sera créé.

Pour mon conteneur Caddy Server, je vais faire ce qui suit :

$ podman generate systemd -f --new --name prathams-caddy
/home/pratham/container-prathams-caddy.service

Comme il ressort de la sortie, le fichier container-prathams-caddy.service a été créé. Il sera créé dans le répertoire de travail courant.

Mais c’est pour les conteneurs qui ont déjà une valeur définie pour l’étiquette io.containers.autoupdate. Qu’en est-il des contenants qui existent déjà sans cette étiquette ? Vous n’avez pas à recréer vos conteneurs avec cette étiquette.

Dans ce cas, modifiez le fichier de service systemd et ajoutez la ligne suivante au ExecStart champ comme ceci:

[...]
ExecStart=/usr/bin/podman run 
    [...]
    --label io.containers.autoupdate=registry
[...]

Essentiellement, votre fichier de service systemd appelle simplement le podman run commande. Tout ce que vous faites est d’ajouter l’étiquette io.containers.autoupdate au podman run commande. Soigné?

Étape 2 : déplacer le fichier de service systemd

Maintenant qu’un service systemd est déjà créé pour nous, nous devons l’activer. Mais avant d’être activé, le fichier de service doit être déplacé dans l’un des répertoires suivants :

  • /etc/systemd/system/: si le conteneur est root-full et doit être démarré avec des privilèges de superutilisateur.
  • ~/.config/systemd/user/: Si le conteneur est sans racine, placez-le dans le répertoire correspondant de l’utilisateur qui doit le démarrer.

Le conteneur prathams-caddy est un conteneur sans racine, je vais donc le déplacer en conséquence.

$ mv -v container-prathams-caddy.service ~/.config/systemd/user/
renamed 'container-prathams-caddy.service' -> '/home/pratham/.config/systemd/user/container-prathams-caddy.service'

Étape 3 : Activer le service systemd

Maintenant que le fichier de service est placé dans un répertoire approprié, nous pouvons procéder à son activation. Mais d’abord, systemd doit être mis au courant de notre service nouvellement créé, sans redémarrer notre ordinateur.

Si le service nécessite des privilèges de superutilisateur, rechargez systemd à l’aide de la commande suivante :

sudo systemctl daemon-reload

Si le service démarre un conteneur sans racine, exécutez la commande suivante :

systemctl --user daemon-reload

Une fois cela fait, nous pouvons simplement utiliser le systemctl enable commande pour activer notre service. Utilisez l’une ou l’autre des commandes en fonction de vos besoins :

# for a root-full container
sudo systemctl enable SERVICE_NAME.service

# for a root-less container
systemctl --user enable SERVICE_NAME.service

Une fois activé, vous pouvez vérifier l’état de votre service. Ne vous inquiétez pas s’il dit inactive (dead). En effet, notre service démarre au démarrage et nous n’avons pas démarré l’ordinateur après avoir activé le service.

$ systemctl --user enable container-prathams-caddy.service
Created symlink /home/pratham/.config/systemd/user/default.target.wants/container-prathams-caddy.service → /home/pratham/.config/systemd/user/container-prathams-caddy.service.

$ systemctl --user status container-prathams-caddy.service
○ container-prathams-caddy.service - Podman container-prathams-caddy.service
     Loaded: loaded (/home/pratham/.config/systemd/user/container-prathams-caddy.service; enabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:podman-generate-systemd(1)

C’est maintenant le meilleur moment pour arrêter le conteneur (s’il est en cours d’exécution) et podman container rm et redémarrez.

$ podman stop prathams-caddy
prathams-caddy

$ podman container rm prathams-caddy
99d1838dd9990b2f79b4f2c83bc9bc16dfbaf3fdeeb6c6418ddd6e641535ce21

Étape 4 (facultative) : Activer la persistance de l’utilisateur

Si vous avez créé un service systemd pour un conteneur sans racine, il est préférable d’activer la persistance de l’utilisateur pour votre utilisateur particulier.

Ceci peut être réalisé en exécutant la commande suivante :

sudo loginctl enable-linger

Alors, mon conteneur sera-t-il automatiquement mis à jour ?

“J’ai ajouté le io.containers.autoupdate étiquette sur mon/mes contenant(s). Je gère également mon ou mes conteneurs avec systemd maintenant. Mon conteneur mettra-t-il automatiquement à jour l’image ?”

Et bien non… Mais il ne reste qu’un pas… ça devrait compter pour quelque chose, non ? Droit? droit…?

Il ne reste plus qu’à activer le podman-auto-update service. Faites-le avec la commande suivante :

sudo systemctl enable podman-auto-update.service

Avec le podman-auto-update service activé, systemd vérifiera si une image doit être mise à jour. S’il y a des mises à jour, les images sont récupérées en premier. Ensuite, le conteneur est redémarré. L’ancienne image est conservée au cas où la mise à jour doit être annulée pour n nombre de raisons.

Mises à jour automatiques ? Non, merci.

Si les mises à jour automatiques ne vous conviennent pas, sachez que vous pouvez mettre à jour manuellement les conteneurs avec une seule commande, à condition qu’ils soient gérés par systemd.

Cette commande est la podman auto-update commande. Et si vous souhaitez simplement vérifier les mises à jour, transmettez le --dry-run option afin qu’aucun conteneur ne soit réellement mis à niveau.

Vérifions si je peux mettre à jour mon caddy image de ‘2.5.2-alpine’ à ‘2.6.1-alpine’ en utilisant le podman auto-update commande.

$ podman container list
CONTAINER ID  IMAGE                   COMMAND               CREATED        STATUS            PORTS       NAMES
a712a3c8846b  docker.io/library/caddy:alpine  caddy run --confi...  2 seconds ago  Up 2 seconds ago              prathams-caddy

$ podman auto-update --dry-run
UNIT                              CONTAINER                      IMAGE         POLICY      UPDATED
container-prathams-caddy.service  a712a3c8846b (prathams-caddy)  caddy:alpine  registry    pending

Comme vous pouvez le voir dans le UPDATED colonne de la sortie de podman auto-update commande, il dit pending. Cela indique qu’une mise à jour est disponible.

Pour mettre à jour le conteneur, supprimez le --dry-run option.

Conclusion

Le processus d’activation des mises à jour automatiques pour vos conteneurs Podman peut sembler un peu compliqué, mais croyez-moi, cela sera payant à long terme. Tous vos conteneurs gérés seront automatiquement mis à jour à minuit (s’il y a des mises à jour). Et, si le conteneur rencontre des problèmes, systemd le ramènera à une image plus ancienne afin que votre conteneur continue de fonctionner.

Si vous avez trouvé cela utile, veuillez commenter ci-dessous et dites-nous ce que vous en pensez ! <3


À propos de l'auteur

SAKHRI Mohamed

Le blog d'un passionné d'informatique qui partage des actualités, des tutoriels, des astuces, des outils en ligne et des logiciels pour Windows, macOS, Linux, Web designer et jeux vidéo.

Voir tous les articles