apt update verhält sich anders in Dockerfile und Prompt, gibt Fehlercode 100 zurück, funktioniert aber

apt update verhält sich anders in Dockerfile und Prompt, gibt Fehlercode 100 zurück, funktioniert aber

Ich versuche, eine apt-Quelle auf dem Microsoft Azure-Funktions-Docker zu installieren. Hier ist meine Docker-Datei

FROM mcr.microsoft.com/azure-functions/python:3.0-python3.9

RUN echo 'deb [trusted=yes] http://deb.debian.org/debian testing main' > /etc/apt/sources.list.d/testing.list
RUN apt update -y

Dies schlägt im apt update -ySchritt mit dem folgenden Fehler fehl

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Get:1 http://deb.debian.org/debian buster InRelease [122 kB]
Get:2 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]
Hit:3 http://security.debian.org/debian-security jessie/updates InRelease
Get:4 http://deb.debian.org/debian buster-updates InRelease [51.9 kB]
Get:5 https://packages.microsoft.com/debian/9/prod stretch InRelease [4009 B]
Get:6 http://deb.debian.org/debian testing InRelease [112 kB]
Get:7 https://packages.microsoft.com/debian/9/prod stretch/main amd64 Packages [161 kB]
Get:8 http://deb.debian.org/debian testing/main amd64 Packages [8248 kB]
Reading package lists...
E: Repository 'http://security.debian.org/debian-security buster/updates InRelease' changed its 'Suite' value from 'stable' to 'oldstable'
E: Repository 'http://deb.debian.org/debian buster InRelease' changed its 'Suite' value from 'stable' to 'oldstable'
E: Repository 'http://deb.debian.org/debian buster-updates InRelease' changed its 'Suite' value from 'stable-updates' to 'oldstable-updates'
The command '/bin/sh -c apt update -y' returned a non-zero code: 100

Aber:

  • wenn ich nach dem Start genau die gleichen beiden Befehle ausführe docker run --rm -it --entrypoint bash mcr.microsoft.com/azure-functions/python:3.0-python3.9, apt update -yfunktioniert es einwandfrei,
  • wenn ich das Basis-Image ändere, auf debian:buster-slimdem das Image basiert, funktioniert der Docker-Build einwandfrei,
  • selbst wenn der Befehl fehlschlägt, kann ich das Paket von installieren testing, z. B. wird es anstelle der Standardinstallation auf Buster apt update -y || apt install g++installiert .g++-10g++-8

Irgendeine Idee, warum der Befehl fehlschlägt? Und wie ich das Problem beheben kann?


Bearbeiten:Das Hinzufügen --allow-releaseinfo-changevon to apt update -yin der Docker-Datei hat das Problem behoben, aber ich würde trotzdem gerne wissenWarumes ist ohne fehlgeschlagen?


Notiz:Frage von SO verschoben, da sie dort offensichtlich nicht zum Thema gehört ... Sagen Sie mir Bescheid, wenn sie hier auch nicht zum Thema gehört.

Antwort1

Kurz zusammengefasst

Das Grundproblem ist ein Fehler im von Ihnen verwendeten Basisimage. Die dauerhafte Lösung besteht darin, /var/lib/apt/listsdas Dockerfile des Basisimages zu löschen. Das Problem kann jedoch vorübergehend umgangen werden, indem das Basisimage neu erstellt oder die --allow-releaseinfo-changeOption verwendet wird.

Der Grund, warum sich dieses Verhalten zwischen docker buildund unterscheidet, docker run -itist die Verwendung des -tFlags zum Zuweisen eines TTY. Dies ändert das Verhalten von apt -y( APT::Get::Assume-Yes).

Vollständige Erklärung

Repository ... hat seinen „Suite“-Wert geändert

Dieser Fehler tritt in folgenden Fällen auf:

  1. APT verfügt über eine zwischengespeicherte Version der Release-Datei -Das ist der Fehler. Docker-Basisimages sollten diesen Cache grundsätzlich leeren.
  2. Das Remote-Repo hat eine neuere Version
  3. Bestimmte Felder stimmen in den beiden Versionen nicht überein

In einer Nicht-Docker-UmgebungDiese Prüfung istum den Benutzer vor der plötzlichen und unerwarteten Installation von Paketen aus einer anderen Debian-Version zu schützen.

mcr.microsoft.com/azure-functions/python:3.0-python3.9 In diesem Fall enthält das Basisbildzwischengespeicherte Versionen der Debian Buster Release-Dateien(Zustand Nr. 1) mit Suite: stable, da dies zum Zeitpunkt der Erstellung aktuell war.

Die Masterkopie imDebian-Archiv ist neuer(Bedingung #2) und hat jetzt Suite: oldstable(Bedingung #3), weil Debian 10 Busterersetztvon Debian 11 Volltreffer.

Wenn Sie also versuchen, apt updatedieses Basisabbild auszuführen, schlägt dies fehl, weilNichtübereinstimmungzwischen der alten zwischengespeicherten Version und der aktuellen Version.

Ich habe gerade Ihr Dockerfile ausprobiert (03.09.2021) und es hat bei mir einwandfrei funktioniert. Das liegt wahrscheinlich daran, dass es seit dem Posten dieser Frage neu erstellt wurde. Dies hätte dazu geführt, dass die neuen Release-Dateien aus dem Debian-Archiv zwischengespeichert und die Nichtübereinstimmung behoben wurden (Nr. 2/Nr. 3 oben sind nicht mehr zutreffend).

Sie können jedoch überprüfen, ob der Fehler weiterhin besteht:

$ docker run --rm -it --entrypoint bash mcr.microsoft.com/azure-functions/python:3.0-python3.9               
root@722ec78233b4:/# grep Suite /var/lib/apt/lists/*Release
/var/lib/apt/lists/deb.debian.org_debian_dists_buster-updates_InRelease:Suite: oldstable-updates
/var/lib/apt/lists/deb.debian.org_debian_dists_buster_InRelease:Suite: oldstable
/var/lib/apt/lists/packages.microsoft.com_debian_9_prod_dists_stretch_InRelease:Suite: stretch
/var/lib/apt/lists/security.debian.org_debian-security_dists_buster_updates_InRelease:Suite: oldstable
/var/lib/apt/lists/security.debian.org_debian-security_dists_jessie_updates_InRelease:Suite: oldoldstable

Und der gleiche Fehler wird nach der nächsten Debian-Version erneut auftreten, wenn aus „buster“ oldoldstableund aus „bullseye“ wird oldstable.

Ich habe vor Kurzem ein ähnliches Problem mit einem nicht verwandten Docker-Basisimage gesehen und glaube, dass dieser Fehler ziemlich weit verbreitet ist.

Verhalten der -yOption

Wenn Sie aptmit einem TTY als Standardeingabe arbeiten, -ywird diese Prüfung überschrieben und der updateBefehl kann erfolgreich ausgeführt werden. Wenn jedoch kein TTY vorhanden ist (nicht interaktive Sitzung), wird die -yOptionwird nicht außer Kraft gesetztdiese Prüfung. Ich habe dies mit einer älteren Version des fehlerhaften Images bestätigt:

# aborts    
docker run --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update -y

# succeeds
docker run -t --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update -y

# prompts for y/N to continue
docker run -it --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update

# aborts
docker run --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update

verwandte Informationen