D11.4 Podman + systemd (Quadlets) ⚙️
Γιατί systemd;
Πρόβλημα χωρίς systemd:
Reboot → rootless containers ΔΕΝ ξεκινούν αυτόματα!
(δεν υπάρχει Docker daemon για auto-restart)
Λύση 1: podman generate systemd (παλιό)
Λύση 2: Quadlets (Podman 4.4+, ΠΡΟΤΕΙΝΕΤΑΙ)
Quadlets — Container as systemd unit
Τα Quadlets είναι αρχεία .container που ο Podman μετατρέπει αυτόματα σε systemd units:
tasks:
# ── Δημιουργία quadlet directory ──────────
- name: Quadlet directory (rootless)
ansible.builtin.file:
path: "/home/{{ podman_user }}/.config/containers/systemd"
state: directory
owner: "{{ podman_user }}"
mode: '0755'
# ── Nginx quadlet ─────────────────────────
- name: "⚙️ Nginx quadlet"
ansible.builtin.copy:
dest: "/home/{{ podman_user }}/.config/containers/systemd/nginx.container"
owner: "{{ podman_user }}"
mode: '0644'
content: |
[Unit]
Description=Nginx web server
After=network-online.target
[Container]
Image=nginx:1.25-alpine
PublishPort=8080:80
Volume=/home/{{ podman_user }}/html:/usr/share/nginx/html:ro,Z
Environment=TZ=Europe/Athens
SecurityLabelDisable=false
ReadOnly=true
Tmpfs=/tmp:size=32m
Tmpfs=/var/cache/nginx:size=128m
Tmpfs=/var/run:size=16m
[Service]
Restart=always
TimeoutStartSec=30
[Install]
WantedBy=default.target # ← rootless: default.target
notify: Reload systemd (user)
# ── App quadlet ───────────────────────────
- name: "⚙️ App quadlet"
ansible.builtin.template:
src: templates/myapp.container.j2
dest: "/home/{{ podman_user }}/.config/containers/systemd/myapp.container"
owner: "{{ podman_user }}"
mode: '0644'
notify: Reload systemd (user)
# ── Enable & start ────────────────────────
- name: "▶️ Start quadlet services"
ansible.builtin.systemd:
name: "{{ item }}"
state: started
enabled: true
scope: user # ← user scope!
loop:
- nginx
- myapp
become: true
become_user: "{{ podman_user }}"
environment:
XDG_RUNTIME_DIR: "/run/user/{{ podman_uid }}"
handlers:
- name: Reload systemd (user)
ansible.builtin.command:
cmd: "systemctl --user daemon-reload"
become: true
become_user: "{{ podman_user }}"
environment:
XDG_RUNTIME_DIR: "/run/user/{{ podman_uid }}"
Quadlet template
# templates/myapp.container.j2
[Unit]
Description=MyApp
After=network-online.target
[Container]
Image=myapp:{{ app_version }}
Network=myapp_net.network
Volume=app_data.volume:/app/data:Z
Environment=NODE_ENV=production
Secret=app_secret_key,type=mount,target=/run/secrets/secret_key
ReadOnly=true
Tmpfs=/tmp:size=64m
[Service]
Restart=always
RestartSec=5s
TimeoutStartSec=60
[Install]
WantedBy=default.target
Σύνοψη D11.4
Podman + systemd Quadlets
│
├── Αρχεία: ~/.config/containers/systemd/*.container
├── Systemd: systemctl --user start nginx
├── Auto-start: loginctl enable-linger
└── Quadlet format:
[Container] Image, Port, Volume, Env, Secret
[Service] Restart=always
[Install] WantedBy=default.target