TL;DR
Problema rădăcină este o eroare în imaginea de bază pe care o utilizați. Soluția permanentă este curățarea /var/lib/apt/lists
în imaginea de bază Dockerfile, dar poate fi rezolvat temporar prin reconstruirea imaginii de bază sau folosind --allow-releaseinfo-change
opțiune.
Motivul pentru care acest comportament diferă între docker build
și docker run -it
este utilizarea -t
flag pentru a aloca un tty. Acest lucru schimbă comportamentul apt -y
(APT::Get::Presumă-Da
).
Explicație completă
Depozitul... și-a schimbat valoarea „Suită”.
Această eroare apare atunci când:
- APT are o versiune în cache a fișierului Release -- Acesta este bug-ul. Imaginile de bază Docker ar trebui, în general, să curețe acest cache.
- Repo-ul de la distanță are o versiune mai nouă
- Anumite câmpuri nu se potrivesc între cele două versiuni
Într-un mediu non-docker, această verificare este destinată pentru a proteja utilizatorul de instalarea bruscă și neașteptată a pachetelor dintr-o versiune Debian diferită.
În acest caz, imaginea de bază mcr.microsoft.com/azure-functions/python:3.0-python3.9
conţine conținut versiuni stocate în cache ale fișierelor Debian buster Release (condiția #1) cu Suită: grajd
, pentru că asta era actual la momentul în care a fost construit.
Cu toate acestea, copia principală în Arhiva Debian este mai nouă (condiția #2) și acum are Suită: oldstable
(condiția #3), deoarece Debian 10 buster a fost inlocuit de Debian 11 bullseye.
Deci când încerci să fugi actualizare apt
pe această imagine de bază, eșuează din cauza nepotrivire între vechea versiune stocată în cache și versiunea actuală.
Am încercat Dockerfile-ul dvs. tocmai acum (2021-09-03) și a funcționat OK pentru mine. Acest lucru se datorează probabil că a fost reconstruit de când ați postat această întrebare. Acest lucru ar fi determinat să memoreze în cache noile fișiere de lansare din arhiva Debian, corectând nepotrivirea (#2/#3 de mai sus nu mai sunt adevărate).
Cu toate acestea, puteți verifica dacă eroarea este încă acolo:
$ 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:Suită: oldstable-updates
/var/lib/apt/lists/deb.debian.org_debian_dists_buster_InRelease:Suită: oldstable
/var/lib/apt/lists/packages.microsoft.com_debian_9_prod_dists_stretch_InRelease:Suită: stretch
/var/lib/apt/lists/security.debian.org_debian-security_dists_buster_updates_InRelease:Suită: oldstable
/var/lib/apt/lists/security.debian.org_debian-security_dists_jessie_updates_InRelease:Suită: oldoldstable
Și aceeași eroare se va repeta după următoarea lansare Debian, când va deveni buster oldoldstable
iar bullseye devine oldstable
.
Recent, am văzut o problemă similară cu o imagine de bază docker fără legătură și cred că această eroare este destul de răspândită.
Comportamentul de -y
opțiune
Când alergi apt
cu un tty ca stdin, -y
va trece peste această verificare și va permite Actualizați
comanda pentru a reuși. Cu toate acestea, dacă nu există tty (sesiune non-interactivă), -y
opțiune nu va trece peste acest control. Am confirmat acest lucru folosind o versiune mai veche a imaginii buggy:
# abandonează
docker run --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update -y
# reușește
docker run -t --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update -y
# solicită ca y/N să continue
docker run -it --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update
# abandonează
docker run --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update