FROM almalinux:10 # dnf-plugins-core -> dnf download, repoquery, config-manager # createrepo_c -> Repo-Metadaten bauen # rpm-sign, gnupg2 -> Pakete umsignieren # git, openssh-clients -> packages.yaml vor jedem Sync aus einem Git-Repo ziehen # python3-pyyaml, jq -> packages.yaml (YAML) nach JSON wandeln und auswerten # cpio -> Pakete fuer die AppStream-Erzeugung teilweise entpacken # rsync -> privaten Paketstand pflegen + alle Fremdrepos zu # einem gemeinsamen Repo zusammenfuehren # util-linux-core -> stellt setpriv (root -> mirror-User droppen) sicher RUN dnf -y install epel-release \ && dnf -y install \ dnf-plugins-core \ createrepo_c \ rpm-sign \ gnupg2 \ git \ openssh-clients \ python3-pyyaml \ util-linux-core \ findutils \ cpio \ rsync \ procps-ng \ jq \ && dnf clean all # AppStream-Metadaten fuer Discover/GNOME Software: das noetige Werkzeug # unterscheidet sich je nach Alma-Version. # - AlmaLinux 9: appstream-glib (aus EPEL) liefert `appstream-builder`, # das direkt ein Verzeichnis voller .rpm-Dateien einliest. # - AlmaLinux 10: appstream-glib ist (Stand jetzt) weder in AlmaLinux 10 # selbst noch in EPEL 10 paketiert. Stattdessen wird `appstreamcli` # genutzt - dessen "compose"-Kommando ist aber NICHT im Basispaket # `appstream` enthalten, sondern im separaten Subpaket # `appstream-compose` (liegt im selben AlmaLinux-10-AppStream-Repo). # Ohne dieses Subpaket bricht `appstreamcli compose` zur Laufzeit mit # "AppStream Compose binary ... was not found" ab. # sync.sh erkennt zur Laufzeit, welches der beiden Werkzeuge vorhanden ist. # Ist keins von beiden installierbar, bricht der Build NICHT ab - die # Discover-Katalogerzeugung wird dann zur Laufzeit einfach uebersprungen # (Pakete bleiben trotzdem ganz normal per dnf/pkcon installierbar). RUN (dnf -y install appstream-glib || dnf -y install appstream appstream-compose || dnf -y install appstream || \ echo "WARNUNG (Build): weder appstream-glib noch appstream verfuegbar - AppStream/Discover-Metadaten werden zur Laufzeit uebersprungen.") \ && dnf clean all RUN useradd -r -m -d /var/lib/mirror-gpg mirror COPY entrypoint.sh /usr/local/bin/entrypoint.sh COPY run-as-mirror.sh /usr/local/bin/run-as-mirror.sh COPY sync.sh /usr/local/bin/sync.sh RUN chmod +x /usr/local/bin/entrypoint.sh /usr/local/bin/run-as-mirror.sh /usr/local/bin/sync.sh RUN mkdir -p /srv/dnf /var/cache/mirror /var/lib/mirror-gpg \ && chown -R mirror:mirror /srv/dnf /var/cache/mirror /var/lib/mirror-gpg ENV HOME=/var/lib/mirror-gpg ENV GNUPGHOME=/var/lib/mirror-gpg/.gnupg # Bleibt root: entrypoint.sh chownt den bind-gemounteten ./gpg-Ordner (der dem # Host gehoert, nicht dem Image) und wechselt danach per setpriv fest zu # "mirror". Alles Weitere (Sync-Loop, git, dnf download, gpg) laeuft # unprivilegiert. ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]