Aller au contenu principal

Exécuter des services avec Quadlet

Qu'est-ce que Quadlet ?​

Quadlet est une fonctionnalité de podman qui permet à un utilisateur d'exécuter un conteneur sous forme d'unités systemd. Il fonctionne avec une syntaxe déclarative comme docker compose, mais s'intègre à systemd et utilise podman comme moteur.

Exemple rapide :​

Créez un fichier nommé ~/.config/containers/systemd/nginx.container avec le contenu ci-dessous.

[Container]
ContainerName=nginx
Image=docker.io/nginxinc/nginx-unprivileged
PublishPort=8080:8080

Enregistrez-le puis exécutez le code ci-dessous.

systemctl --user daemon-reload
systemctl --user start nginx
xdg-open localhost:8080

Cas d'usage​

Quadlet peut être utilisé pour les applications packagées sous forme de conteneurs, comme les applications serveur. Vous trouverez de nombreux exemples d'applications conteneurisées chez Linux Server.

Gestion de Quadlet​

Quadlet peut être géré comme n'importe quel autre service systemd à l'aide des commandes ci-dessous.

Vérifier l'état du quadlet

systemctl --user status nginx

Arrêter le quadlet

systemctl --user stop nginx

Vous trouverez d'autres commandes dans man systemctl ou tldr systemctl.

Emplacement des fichiers quadlet​

Vous pouvez placer vos fichiers quadlet dans ces emplacements, triés par priorité.

  • $XDG_RUNTIME_DIR/containers/systemd/ - Généralement utilisé pour des quadlets temporaires
  • ~/.config/containers/systemd/ - Emplacement recommandé
  • /etc/containers/systemd/users/$(UID)
  • /etc/containers/systemd/users/

Exécution du quadlet au démarrage​

Remarque : si vous souhaitez que votre service démarre même lorsque vous n'êtes pas connecté, exécutez loginctl enable-linger $USER pour le démarrer automatiquement.

Vous voudrez peut-être exécuter votre quadlet automatiquement au démarrage ; ajoutez simplement une section install au fichier quadlet pour qu'il démarre automatiquement. La plupart du temps, default.target convient, mais si vous avez besoin d'une autre cible, vous pouvez consulter la documentation systemd.

[Install]
WantedBy=default.target

Par exemple :

[Container]
ContainerName=nginx
Image=docker.io/nginxinc/nginx-unprivileged
PublishPort=8080:8080

[Install]
WantedBy=default.target

Vous n'avez pas besoin d'exécuter systemctl enable car les fichiers de service sont générés. De toute façon, vous ne pourriez pas l'exécuter.

Conversion de Docker Compose en unité Quadlet​

Vous constaterez que la plupart des applications conteneurisées présentes sur le web sont construites avec docker compose. Même Linux Server, lié ci-dessus, documente tous ses conteneurs à l'aide de fichiers compose. Vous devrez donc d'abord les convertir avant de les exécuter en quadlet ; heureusement, vous pouvez utiliser podlet pour vous aider à les convertir.

Par défaut, quadlet exige le nom complet du dépôt. La plupart des images se trouvent sur Docker Hub, vous pouvez donc simplement ajouter docker.io/ (par ex. « nginxinc/nginx-unprivileged » devient « docker.io/nginxinc/nginx-unprivileged »).

Exécution d'un conteneur rootful en quadlet​

Idéalement, vous exécuteriez tous les conteneurs avec podman rootless, mais malheureusement tous ne fonctionnent pas ainsi. Comme vous l'avez peut-être remarqué au début, ce guide utilise nginx-unprivileged plutôt que le nginx habituel, car ce dernier a besoin de root pour fonctionner. Pour utiliser podman rootful, vous devrez utiliser un autre emplacement de quadlet et l'exécuter avec systemctl en root (sans --user).

Emplacements des quadlets rootful

  • /run/containers/systemd/ - Quadlets temporaires
  • /etc/containers/systemd/ - Emplacement recommandé
  • /usr/share/containers/systemd/ - Défini par l'image

Description des clés Quadlet courantes​

OptionExempleDescription
ContainerNameContainerName=nginxNom du conteneur.
ImageImage=docker.io/nginxinc/nginx-unprivilegedImage de conteneur que vous souhaitez utiliser.
PublishPortPublishPort=8080:8080Port ouvert par le conteneur. (HOST_PORT:CONTAINER_PORT)
VolumeVolume=/path/to/data:/data:zRelie un dossier de l'hôte à un dossier du conteneur. (HOST_FOLDER:CONTAINER_FOLDER:OPTION)
NetworkNetwork=hostRéseau utilisé par le conteneur. La valeur peut être host, none ou un nom de réseau défini par l'utilisateur

L'option z du volume sert à empêcher selinux de bloquer l'accès au dossier. Vous pouvez en savoir plus ici.

Exemple​

Serveur Minecraft​

Documentation : https://docker-minecraft-server.readthedocs.io/en/latest Fichier Quadlet :

[Container]
ContainerName=minecraft
Environment=EULA=TRUE
Image=docker.io/itzg/minecraft-server
PublishPort=25565:25565
Volume=/path/to/data:/data:z

# Remove if you don't want autostart
[Install]
WantedBy=default.target

Utilisez un chemin absolu pour le volume, p. ex. /home/username/minecraft/data.

Serveur Plex​

Documentation : https://github.com/plexinc/pms-docker Fichier Quadlet :

[Container]
ContainerName=plex
Environment=TZ=Your/TimeZone
Image=docker.io/plexinc/pms-docker
Network=host
Volume=/path/to/config:/config:z
Volume=/path/to/transcode:/transcode:z
Volume=/path/to/media:/data:z

# Remove if you don't want autostart
[Install]
WantedBy=default.target

Vous trouverez une liste des fuseaux horaires ici.

Utilisez un chemin absolu pour le volume, p. ex. /home/username/plex/config.

Vous pouvez monter plusieurs volumes pour vos médias, p. ex. Volume=/path/to/media:/tv:z et Volume=/path/to/another/media:/movie:z. Consultez la documentation pour plus d'informations.

Site web du projet​

https://podman.io/


Documentation originale empruntée à la documentation Bazzite par @asen23