ESPO-02 folgt der offiziellen Doku: konkurrierende Pakete zuerst entfernen

Der Abgleich mit docs.docker.com/engine/install/ubuntu zeigte eine fehlende
Vorstufe: Die Doku verlangt, docker.io, docker-compose, docker-doc,
docker-buildx, podman-docker sowie containerd und runc zu entfernen, bevor
installiert wird - containerd.io buendelt containerd und runc und steht mit
beiden in Conflicts. Genau das passt zum Symptom "unerfuellte Abhaengigkeiten".

Ausserdem wie in der Doku ca-certificates und curl vor dem Schluessel. Die
deb822-Quelle entspricht bereits woertlich der Doku; beim Pinning bleiben wir
strenger als sie (sie pinnt nur docker-ce und docker-ce-cli).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
gordon.zimm 2026-09-24 09:22:39 +02:00
parent 2cc7896715
commit 76962b9cf2

View File

@ -12,7 +12,18 @@ CONTAINERD_VERSION="2.3.5-1~ubuntu.24.04~noble"
COMPOSE_VERSION="5.5.1-1~ubuntu.24.04~noble" COMPOSE_VERSION="5.5.1-1~ubuntu.24.04~noble"
BUILDX_VERSION="0.37.1-1~ubuntu.24.04~noble" BUILDX_VERSION="0.37.1-1~ubuntu.24.04~noble"
# 1. Paketquelle von Docker einrichten (Schluessel und deb822-Quelle), falls noch nicht vorhanden. # 1. Konkurrierende Pakete entfernen. Die offizielle Doku verlangt das ausdruecklich, bevor
# installiert wird: containerd.io buendelt containerd und runc und steht mit beiden in Conflicts.
ALTPAKETE="$(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc 2>/dev/null | awk '$2 != "deinstall" {print $1}')"
if [ -n "$ALTPAKETE" ]; then
echo "Konkurrierende Pakete gefunden: $ALTPAKETE"
DEBIAN_FRONTEND=noninteractive apt-get remove -y -q $ALTPAKETE || { echo "FEHLER: konkurrierende Pakete nicht entfernbar"; echo "ESPO02_ERGEBNIS: FEHLER"; exit 1; }
else
echo "Konkurrierende Pakete: keine installiert"
fi
# 2. Paketquelle von Docker einrichten (Schluessel und deb822-Quelle), falls noch nicht vorhanden.
DEBIAN_FRONTEND=noninteractive apt-get install -y -q ca-certificates curl >/dev/null
install -m 0755 -d /etc/apt/keyrings install -m 0755 -d /etc/apt/keyrings
if [ ! -s /etc/apt/keyrings/docker.asc ]; then if [ ! -s /etc/apt/keyrings/docker.asc ]; then
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc || { echo "FEHLER: Schluessel nicht ladbar"; exit 1; } curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc || { echo "FEHLER: Schluessel nicht ladbar"; exit 1; }
@ -28,7 +39,7 @@ Signed-By: /etc/apt/keyrings/docker.asc
CONF CONF
apt-get update -qq || { echo "FEHLER: apt-get update"; exit 1; } apt-get update -qq || { echo "FEHLER: apt-get update"; exit 1; }
# 2. Genau diese Versionen installieren und auf Hold setzen, damit nichts unbemerkt nachzieht. # 3. Genau diese Versionen installieren und auf Hold setzen, damit nichts unbemerkt nachzieht.
# Scheitert die Installation, sagt das Skript woran - eine blosse Fehlermeldung hilft niemandem weiter. # Scheitert die Installation, sagt das Skript woran - eine blosse Fehlermeldung hilft niemandem weiter.
PAKETE="docker-ce=$DOCKER_VERSION docker-ce-cli=$DOCKER_VERSION containerd.io=$CONTAINERD_VERSION" PAKETE="docker-ce=$DOCKER_VERSION docker-ce-cli=$DOCKER_VERSION containerd.io=$CONTAINERD_VERSION"
PAKETE="$PAKETE docker-compose-plugin=$COMPOSE_VERSION docker-buildx-plugin=$BUILDX_VERSION" PAKETE="$PAKETE docker-compose-plugin=$COMPOSE_VERSION docker-buildx-plugin=$BUILDX_VERSION"
@ -46,7 +57,7 @@ if ! DEBIAN_FRONTEND=noninteractive apt-get install -y -q $PAKETE; then
fi fi
apt-mark hold docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-buildx-plugin >/dev/null apt-mark hold docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-buildx-plugin >/dev/null
# 3. Daemon-Grundlagen: Logrotation, weil der Standardtreiber nicht rotiert. # 4. Daemon-Grundlagen: Logrotation, weil der Standardtreiber nicht rotiert.
# Keine abweichende Bindeadresse: die Ports muessen fuer den Reverse Proxy erreichbar sein, # Keine abweichende Bindeadresse: die Ports muessen fuer den Reverse Proxy erreichbar sein,
# die Beschraenkung uebernimmt Schritt 4. # die Beschraenkung uebernimmt Schritt 4.
install -d -m 0755 /etc/docker install -d -m 0755 /etc/docker
@ -60,7 +71,7 @@ CONF
systemctl enable --now docker >/dev/null 2>&1 systemctl enable --now docker >/dev/null 2>&1
systemctl restart docker || { echo "FEHLER: docker startet nicht"; exit 1; } systemctl restart docker || { echo "FEHLER: docker startet nicht"; exit 1; }
# 4. Firewall: Docker setzt seine Weiterleitungsregeln vor die INPUT-Kette und umgeht damit ufw. # 5. Firewall: Docker setzt seine Weiterleitungsregeln vor die INPUT-Kette und umgeht damit ufw.
# DOCKER-USER ist die dafuer vorgesehene Stelle. Das Subnetz ermittelt die VM selbst, # DOCKER-USER ist die dafuer vorgesehene Stelle. Das Subnetz ermittelt die VM selbst,
# es ist also kein kundenspezifischer Wert noetig. # es ist also kein kundenspezifischer Wert noetig.
command -v iptables >/dev/null || { echo "FEHLER: iptables fehlt"; exit 1; } command -v iptables >/dev/null || { echo "FEHLER: iptables fehlt"; exit 1; }
@ -98,7 +109,7 @@ systemctl daemon-reload
systemctl enable espo-docker-firewall.service >/dev/null 2>&1 systemctl enable espo-docker-firewall.service >/dev/null 2>&1
systemctl restart espo-docker-firewall.service || { echo "FEHLER: Firewallregeln nicht gesetzt"; FEHLER=1; } systemctl restart espo-docker-firewall.service || { echo "FEHLER: Firewallregeln nicht gesetzt"; FEHLER=1; }
# 5. Ergebnis zeigen und pruefen. # 6. Ergebnis zeigen und pruefen.
docker --version docker --version
docker compose version docker compose version
docker info --format 'Logtreiber: {{.LoggingDriver}} Live-Restore: {{.LiveRestoreEnabled}}' docker info --format 'Logtreiber: {{.LoggingDriver}} Live-Restore: {{.LiveRestoreEnabled}}'