Puncte:3

apt actualizează un comportament diferit în Dockerfile și prompt, returnează codul de eroare 100, dar funcționează

drapel kr

Încerc să instalez o sursă apt pe funcția Microsoft azure docker, aici este fișierul meu Docker

DE LA 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

Acest lucru eșuează în actualizare apt -y pas cu următoarea eroare

AVERTISMENT: apt nu are o interfață CLI stabilă. Utilizați cu precauție în scripturi.

Obțineți:1 http://deb.debian.org/debian buster InRelease [122 kB]
Obțineți:2 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]
Hit:3 http://security.debian.org/debian-security jessie/updates InRelease
Obțineți:4 http://deb.debian.org/debian buster-updates InRelease [51.9 kB]
Obțineți: 5 https://packages.microsoft.com/debian/9/prod stretch InRelease [4009 B]
Obține:6 http://deb.debian.org/debian testing InRelease [112 kB]
Obțineți:7 https://packages.microsoft.com/debian/9/prod stretch/main pachete amd64 [161 kB]
Obține:8 http://deb.debian.org/debian testing/main pachete amd64 [8248 kB]
Se citesc listele de pachete...
E: Depozitul „http://security.debian.org/debian-security buster/updates InRelease” și-a schimbat valoarea „Suite” din „stable” în „oldstable”
E: Depozitul „http://deb.debian.org/debian buster InRelease” și-a schimbat valoarea „Suite” din „stable” în „oldstable”
E: Depozitul „http://deb.debian.org/debian buster-updates InRelease” și-a schimbat valoarea „Suite” din „stable-updates” în „oldstable-updates”
Comanda „/bin/sh -c apt update -y” a returnat un cod diferit de zero: 100

Dar:

  • dacă rulez exact aceleași două comenzi după lansare docker run --rm -it --entrypoint bash mcr.microsoft.com/azure-functions/python:3.0-python3.9, actualizare apt -y Merge bine,
  • dacă schimb imaginea de bază în debian:buster-slim pe care se bazează imaginea, construcția docker funcționează bine,
  • chiar dacă comanda eșuează, pot instala pachetul din testarea, de exemplu., apt update -y || apt install g++ va instala g++-10 în loc de implicit g++-8 pe Buster.

Ai idee de ce eșuează comanda? Și cum pot să o repar?


Editați | ×: Adăugând --allow-releaseinfo-change la actualizare apt -y în dockerfile am rezolvat problema, dar tot aș dori să știu De ce a esuat fara?


Notă: Întrebarea a fost mutată de la SO deoarece se pare că e în afara subiectului acolo... Anunță-mă dacă este și în afara subiectului aici.

Michael Hampton avatar
drapel cz
Repozițiile acelea apt sunt o mizerie completă. Cine a creat acel recipient pe care îl folosești ca bază? Nu aș fi surprins dacă nimic nu funcționează.
drapel kr
@MichaelHampton Este imaginea oficială pentru funcția dockerizată a aplicației Python pe Azure. Dockerfile poate fi găsit aici https://github.com/Azure/azure-functions-docker/blob/dev/host/3.0/buster/amd64/python/python39/python39.Dockerfile
Puncte:3
drapel br

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:

  1. 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.
  2. Repo-ul de la distanță are o versiune mai nouă
  3. 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
drapel kr
Mulțumesc pentru răspuns, asta nu explică de ce codul funcționează bine atunci când rulează direct în container vs. în Dockerfile, aveți idee?
drapel br
Funcționează bine pentru mine în ambele cazuri (docker build și docker run), deoarece imaginea a fost actualizată. Mai puteți reproduce acest lucru și, dacă da, puteți publica rezultatul „docker image ls mcr.microsoft.com/azure-functions/python:3.0-python3.9” (în special ID-ul imaginii)?
drapel kr
Din păcate, am actualizat și imaginea, așa că nu o mai pot reproduce... Dacă găsesc ID-ul specific al imaginii care nu funcționează, vă voi anunța.
drapel br
Am găsit o versiune veche a imaginii și am reușit să reproduc comportamentul. A adăugat o explicație

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.