
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 -y
Schritt 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 -y
funktioniert es einwandfrei, - wenn ich das Basis-Image ändere, auf
debian:buster-slim
dem 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 Busterapt update -y || apt install g++
installiert .g++-10
g++-8
Irgendeine Idee, warum der Befehl fehlschlägt? Und wie ich das Problem beheben kann?
Bearbeiten:Das Hinzufügen --allow-releaseinfo-change
von to apt update -y
in 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/lists
das Dockerfile des Basisimages zu löschen. Das Problem kann jedoch vorübergehend umgangen werden, indem das Basisimage neu erstellt oder die --allow-releaseinfo-change
Option verwendet wird.
Der Grund, warum sich dieses Verhalten zwischen docker build
und unterscheidet, docker run -it
ist die Verwendung des -t
Flags 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:
- APT verfügt über eine zwischengespeicherte Version der Release-Datei -Das ist der Fehler. Docker-Basisimages sollten diesen Cache grundsätzlich leeren.
- Das Remote-Repo hat eine neuere Version
- 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 update
dieses 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“ oldoldstable
und 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 -y
Option
Wenn Sie apt
mit einem TTY als Standardeingabe arbeiten, -y
wird diese Prüfung überschrieben und der update
Befehl kann erfolgreich ausgeführt werden. Wenn jedoch kein TTY vorhanden ist (nicht interaktive Sitzung), wird die -y
Optionwird 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