Quadlet, ευκολα containers με το systemd

Τα containers είναι το παρόν και το μέλλον στους servers, αλλά το να φτιάξεις ένα service που να τα ξεκινά δεν είναι ότι ευκολότερο. Είχα παιδευτεί λίγο για να τα καταφέρω την πρώτη φορά. Για να λέω όμως και την πλήρη αλήθεια, απλό είναι, αλλά θέλει διάβασμα :innocent:

Ένα νέο εργαλείο το Quadlet ήρθε να κάνει την διαδικασία πολύ απλή και κατανοητή. Τεχνικά είναι ένα systemd.generator(7), δηλαδή μια γεννήτρια που θα φτιάξει το service, όπως για παράδειγμα το systemd-fstab-generator(8) που διαβάζει το /etc/fstab και φτιάχνει τα αντίστοιχα unit files.

Παράδειγμα

Έστω ότι θέλουμε να τρέξουμε το redis ώστε να τρέχει μέσα σε ένα container. Θα φτιάξουμε ένα αρχείο /etc/containers/systemd/redis.container με τα παρακάτω:

[Unit]
Description=Redis container

[Container]
Image=docker.io/redis
PublishPort=6379:6379
User=999

[Service]
Restart=always

[Install]
WantedBy=local.target

Θα πρέπει να έχουμε κατεβάσει το image γιατί δεν το κάνει μόνο του, και να φορτώσουμε τις αλλαγές με systemctl daemon-reload. Και αυτό ήταν έχουμε πλέον διαθέσιμο το redis σαν ένα systemd service.

Για σύγκριση ας δούμε το αρχείο που φτιάχνει και θα το βρούμε στο /run/systemd/generator/redis.service.

Automatically generated by quadlet-generator
# Automatically generated by quadlet-generator
[Unit]
Description=Redis container
RequiresMountsFor=%t/containers
SourcePath=/etc/containers/systemd/redis.container

[X-Container]
Image=docker.io/redis
PublishPort=6379:6379
User=999

[Service]
Restart=always
Environment=PODMAN_SYSTEMD_UNIT=%n
KillMode=mixed
ExecStartPre=-rm -f %t/%N.cid
ExecStopPost=-/usr/bin/podman rm -f -i --cidfile=%t/%N.cid
ExecStopPost=-rm -f %t/%N.cid
Delegate=yes
Type=notify
NotifyAccess=all
SyslogIdentifier=%N
ExecStart=/usr/bin/podman run --name=systemd-%N --cidfile=%t/%N.cid --replace --rm -d --log-driver journald --pull=never --runtime /usr/bin/crun --cgroups=split --tz=local --init --sdnotify=conmon --security-opt=no-new-privileges --cap-drop=all --mount type=tmpfs,tmpfs-size=512M,destination=/tmp --user 999 --uidmap 999:999:1 --uidmap 0:0:1 --uidmap 1:362144:998 --uidmap 1000:363142:64538 --gidmap 0:0:1 --gidmap 1:362144:65536 -p=6379:6379 docker.io/redis

[Install]
WantedBy=local.target

Η υπηρεσία δεν θα χρησιμοποιήσει κάποια capabilities, θα στήσει ένα cgroup και θα χρησιμοποιήσει το journal για τα logs. Αλλά αυτά μπορούν να αλλάξουν και να προσαρμοστούν όπως θέλουμε.

Δυστυχώς κάνει χρήση του podpan και όχι του docker, οπότε δεν το δοκίμασα στην πράξη. Υπάρχουν συζητήσεις να ενσωματωθεί στην επόμενη έκδοση του podman. Αν κάποιος ξέρει κάτι ανάλογο για το docker ας το αναφέρει στα σχόλια.

Πηγές

https://blogs.gnome.org/alexl/2021/10/12/quadlet-an-easier-way-to-run-system-containers/