Podman
Podman
Configuration post installation (debian 11)
ajouter le registre docker et rootless session
sudo loginctl enable-linger 1000
cat <<EOF | sudo tee /etc/containers/registries.conf
[registries.search]
registries = ['docker.io']
EOF
Mise a jour automatique
Tout ce qui doit être fait est d’activer le service suivant podman-auto-update
Exemple de commande générique
Executer un manifest k8s:
Supprimer un manifest k8s:
Podman-compose / Docker Compose avec Podman
Pour installer podman-compose (alternative python) et sa documentation, voir ici.
Configurer Docker Compose (v2) dans l'espace utilisateur pour Podman
Si vous préférez utiliser la commande native podman compose en s'appuyant sur le binaire officiel de Docker Compose (ce qui résout de nombreux problèmes de compatibilité), vous pouvez l'installer en mode rootless (dans l'espace utilisateur) :
1. Créer le dossier des plugins CLI et télécharger docker-compose
Téléchargez le binaire officiel de Docker Compose et placez-le dans le dossier de configuration utilisateur :
mkdir -p ~/.docker/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose
2. Activer le socket système utilisateur de Podman
Pour que docker-compose puisse communiquer avec Podman, vous devez activer le socket utilisateur géré par systemd :
3. Vérifier le fonctionnement
Vous pouvez maintenant lancer des commandes compose avec podman compose :
Commandes associées usage desktop :
Lancer un conteneur isolé en arrière-plan (détaché) et s'y connecter
Pour lancer le conteneur en arrière-plan de façon permanente sans qu'il ne s'arrête immédiatement (car un conteneur s'arrête si son processus principal se termine), on utilise la commande sleep infinity avec l'argument -d (detached) :
# 1. Lancer le conteneur en arrière-plan
podman run -d --name sandbox \
--userns keep-id \
-v /home/user/Documents/volume/sandbox:/home/user \
-w /home/user \
quay.io/toolbx-images/debian-toolbox:12 sleep infinity
Ensuite, on s'y connecte:
# Connexion en tant qu'utilisateur standard (user)
podman exec -it sandbox bash
# Connexion en tant que root (pour installer des paquets)
podman exec -it -u root sandbox bash
Exécuter une application graphique (GUI) depuis le conteneur
Il est tout à fait possible de lancer des applications graphiques (via X11 ou Wayland) depuis un conteneur Podman rootless en partageant les sockets graphiques de l'hôte :
Pour X11 (je pense):
# 1. Autoriser les connexions locales au serveur X11 de l'hôte
xhost +local:root
# 2. Lancer le conteneur avec l'accès au socket X11
podman run -it --name sandbox-gui \
--userns keep-id \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
-e DISPLAY=$DISPLAY \
-v /home/user/Documents/volume/sandbox:/home/user \
-w /home/user \
quay.io/toolbx-images/debian-toolbox:12 bash
Pour Wayland :
podman run -it --name sandbox-wayland \
--userns keep-id \
-v $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY:$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY:ro \
-e WAYLAND_DISPLAY=$WAYLAND_DISPLAY \
-e XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR \
-v /home/user/Documents/volume/sandbox:/home/user \
-w /home/user \
quay.io/toolbx-images/debian-toolbox:12 bash
Avoir un système d'init (comme Systemd dans LXC)
Exécuter un véritable système d'initialisation (systemd) à l'intérieur du conteneur en utilisant l'option --systemd=always :
podman run -d --name sandbox-init \
--systemd=always \
--userns keep-id \
-v /home/user/Documents/volume/sandbox:/home/user \
-w /home/user \
quay.io/toolbx-images/debian-toolbox:12
Une fois démarré, entrer avec podman exec -it sandbox-init bash et utiliser systemctl pour démarrer ou arrêter des services en arrière-plan, exactement comme dans un conteneur LXC.
Lancer le conteneur via un manifest Kubernetes (YAML)
Podman a la capacité native de lire et d'exécuter des fichiers de spécification Kubernetes (YAML) grâce à la commande podman play kube sandbox-kube.yaml.
Un fichier manifest minimaliste nommé sandbox-kube.yaml a été créé dans le dossier /home/user/Documents/volume/sandbox/sandbox-kube.yaml :
apiVersion: v1
kind: Pod
metadata:
name: sandbox
annotations:
io.podman.annotations.userns: "keep-id"
spec:
containers:
- name: debian-box
image: quay.io/toolbx-images/debian-toolbox:12
command: ["sleep", "infinity"]
workingDir: /home/user
volumeMounts:
- name: home-sandbox
mountPath: /home/user
securityContext:
runAsUser: 1000
runAsGroup: 1000
volumes:
- name: home-sandbox
hostPath:
path: /home/user/Documents/volume/sandbox
type: Directory
Commandes associées usage K8S :
# Lancer le pod à partir du manifest
podman play kube /home/user/Documents/volume/sandbox/sandbox-kube.yaml
# Arrêter et supprimer le pod
podman play kube --down /home/user/Documents/volume/sandbox/sandbox-kube.yaml
résolution de problème
Permission insufisante
Problème
Lors de l'exécution d'un conteneur avec Podman, vous rencontrez l'erreur suivante :
Error: copying system image from manifest list: writing blob: adding layer with blob "sha256:...": processing tar file(potentially insufficient UIDs or GIDs available in user namespace (requested...): Check /etc/subuid and /etc/subgid if configured locally and run "podman system migrate": lchown ...: invalid argument): exit status1
Cause
Le problème est lié à la configuration des IDs subordonnés pour l'utilisateur qui exécute le conteneur. Les fichiers /etc/subuid et /etc/subgid ne sont pas correctement configurés pour cet utilisateur.
(peut être cotre shell est sanboxé attention)
Résolution
- Vérifiez les fichiers
/etc/subuidet/etc/subgid:
Vérifiez si votre utilisateur est présent dans ces fichiers. Si ce n'est pas le cas, vous devez ajouter une entrée pour votre utilisateur.
- Ajoutez une entrée pour votre utilisateur :
Déterminez une plage d'IDs subordonnés qui ne chevauche pas les IDs existants sur votre système. Vous pouvez utiliser une valeur élevée comme 231072 (ou une autre valeur qui n'est pas déjà utilisée).
Remplacez votre_utilisateur par votre nom d'utilisateur réel.
- Exécutez la commande de migration :
Cette commande met à jour la configuration de Podman pour utiliser les nouvelles entrées dans /etc/subuid et /etc/subgid.
- Vérifiez que le problème est résolu :
Essayez d'exécuter à nouveau le conteneur qui a provoqué l'erreur. Si tout se passe bien, le conteneur devrait s'exécuter sans problème.
Conseils
- Assurez-vous de choisir une plage d'IDs subordonnés qui ne chevauche pas les IDs existants sur votre système.
- Si vous avez déjà utilisé une plage d'IDs subordonnés pour un autre utilisateur, assurez-vous de choisir une nouvelle plage qui ne chevauche pas la précédente.
Notes
- Les IDs subordonnés sont utilisés pour mapper les IDs d'utilisateur et de groupe à l'intérieur d'un conteneur vers des IDs différents sur le système hôte.
- Les fichiers
/etc/subuidet/etc/subgidsont utilisés pour définir ces mappings.
En suivant ces étapes, vous devriez être en mesure de résoudre le problème lié à Podman et aux IDs subordonnés.
Erreur sd-bus call: Operation not permitted (OCI permission denied)
Problème
Lors du démarrage d'un conteneur, vous obtenez l'erreur :
Error: crun: sd-bus call: Operation not permitted: Permission denied: OCI permission denied
Cause
Podman tente d'utiliser systemd comme gestionnaire de cgroups (cgroup_manager). Dans certains environnements (notamment sur Debian ou des sessions gérées), le runtime crun n'arrive pas à communiquer avec le bus utilisateur de systemd pour créer un "scope" de contrôle.
Résolution
Forcer l'utilisation de cgroupfs au lieu de systemd.
-
Créez ou modifiez le fichier
~/.config/containers/containers.conf: -
Note importante : Les conteneurs existants conservent le paramètre utilisé lors de leur création. Si un conteneur a été créé avant cette modification, il doit être supprimé et recréé pour prendre en compte le nouveau gestionnaire.
Erreur open .../merged: Permission denied avec --userns=keep-id
Problème
Le conteneur refuse de démarrer avec une erreur de permission sur le répertoire merged de l'overlay, alors que vous êtes propriétaire des fichiers.
Cause
C'est une subtilité du mode rootless combiné à --userns=keep-id (utilisé par défaut par Distrobox).
- En mode rootless classique, l'utilisateur interne root est mappé sur votre utilisateur hôte (UID 1000).
- Avec keep-id, votre UID 1000 reste 1000 à l'intérieur du conteneur. Par conséquent, le root interne est mappé sur un UID secondaire (défini dans /etc/subuid).
- Si votre répertoire personnel ou les sous-répertoires de ~/.local/share/containers/storage ont des permissions trop restrictives (ex: 700), cet UID secondaire ne peut pas traverser les dossiers pour accéder au système de fichiers du conteneur.
Résolution
Il faut autoriser la traversée des répertoires (exécution +x) pour les "autres" (ou via des ACLs) sur toute la chaîne menant au stockage.