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 dem gemeinsamen # Freigabe-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 werden mit `appstreamcli` # gebaut. Dessen "compose"-Kommando steckt NICHT im Basispaket `appstream`, # sondern im separaten Subpaket `appstream-compose` (gleiches AlmaLinux-10- # AppStream-Repo). Ohne dieses Subpaket bricht `appstreamcli compose` zur # Laufzeit mit "AppStream Compose binary ... was not found" ab. RUN dnf -y install appstream appstream-compose \ && dnf clean all RUN useradd -r -m -d /var/lib/mirror mirror COPY gpg-import.sh /usr/local/lib/gpg-import.sh 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 /etc/mirror-gpg \ && chown -R mirror:mirror /srv/dnf /var/cache/mirror /etc/mirror-gpg ENV HOME=/var/lib/mirror # Gemeinsamer Signing-Key: entrypoint.sh kopiert ihn beim Start aus dem # read-only gemounteten /run/secrets/gpg hierher - derselbe Key, mit dem der # flatpak-mirror-Container signiert. ENV GNUPGHOME=/etc/mirror-gpg # Bleibt root: entrypoint.sh uebernimmt den gemounteten Key und die # Verzeichnisrechte und wechselt danach per setpriv fest zu "mirror". Alles # Weitere (Sync-Loop, git, dnf download, gpg) laeuft unprivilegiert. ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]