# Node image for the swarm DR test cluster, layered on the distro's infinito # image so python + ansible + the CLI (venv) are already baked -- the per-node # .deb bootstrap is gone. Adds only the node extras: dnsmasq (lab DNS), openssh # server (backup pull chain), cryptsetup + e2fsprogs (LUKS drill device), kmod # (modprobe, for the data-root filesystem). # Distro-agnostic install (apt/dnf/pacman) since INFINITO_IMAGE is per-distro. # systemd-resolved is masked so it never races dnsmasq for port 53. The pacman # branch refreshes the keyring and does a full -Syu: the pinned parent image can # be weeks old, so a partial -Sy would hit unknown packager keys and would link # fresh binaries against the image's older libraries. # # udevd is masked because it claims the device-mapper nodes and leaves symlinks # to /dev/dm-N targets a tmpfs /dev never gets, while without it libdevmapper # creates them. # # /etc/shadow is 0000 on the RHEL-family parents, where the host's unix-chkpwd # AppArmor profile then denies the setuid helper CAP_DAC_READ_SEARCH and every # PAM account lookup fails; a hard 0600 instead of u+rw breaks debian's setgid # helper. # # The zfs userland arrives with the parent image and enables six units by # preset. All of them run before scripts/tests/deploy/utils/filesystem/ # docker_dataroot.sh creates the pool, so on a node they can only fail and # leave systemd degraded; they are masked here rather than in the parent, which # a real host also boots. ARG INFINITO_IMAGE FROM ${INFINITO_IMAGE} RUN set -eux; \ if command -v apt-get >/dev/null 2>&1; then \ apt-get update -qq; \ apt-get install -y -qq --no-install-recommends dnsmasq openssh-server cryptsetup e2fsprogs elfutils kmod python3-apt; \ rm -rf /var/lib/apt/lists/*; \ elif command -v dnf >/dev/null 2>&1; then \ dnf install -y dnsmasq openssh-server cryptsetup e2fsprogs elfutils kmod; \ dnf clean all; \ elif command -v pacman >/dev/null 2>&1; then \ pacman -Sy --noconfirm --needed archlinux-keyring; \ pacman -Syu --noconfirm --needed dnsmasq openssh cryptsetup e2fsprogs elfutils kmod; \ rm -rf /var/cache/pacman/pkg/*; \ else \ echo "no supported package manager (apt/dnf/pacman)" >&2; exit 1; \ fi; \ systemctl mask systemd-resolved; \ systemctl mask systemd-udevd systemd-udevd-kernel.socket systemd-udevd-control.socket systemd-udevd-varlink.socket systemd-udev-trigger; \ systemctl mask modprobe@.service; \ systemctl mask zfs-import-cache zfs-import-scan zfs-mount zfs-share zfs-volume-wait zfs-zed; \ systemctl enable ssh 2>/dev/null || systemctl enable sshd; \ chmod u+rw /etc/shadow; \ if [ -e /etc/gshadow ]; then chmod u+rw /etc/gshadow; fi; \ mkdir -p /etc/systemd/journald.conf.d; \ printf '[Journal]\nSystemMaxUse=256M\nRuntimeMaxUse=64M\n' > /etc/systemd/journald.conf.d/99-ci.conf; \ rm -f /var/lib/dbus/machine-id; \ truncate -s 0 /etc/machine-id