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