
Estoy intentando instalar una fuente apta en la ventana acoplable de funciones de Microsoft Azure, aquí está mi Dockerfile
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
Esto falla en el apt update -y
paso con el siguiente error.
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
Pero:
- si ejecuto exactamente los mismos dos comandos después del inicio
docker run --rm -it --entrypoint bash mcr.microsoft.com/azure-functions/python:3.0-python3.9
,apt update -y
funciona bien, - si cambio la imagen base en
debian:buster-slim
la que se basa la imagen, la compilación de la ventana acoplable funciona bien, - Incluso si el comando falla, puedo instalar el paquete desde
testing
, por ejemplo,apt update -y || apt install g++
lo instalarég++-10
en lugar del predeterminadog++-8
en Buster.
¿Alguna idea de por qué falla el comando? ¿Y cómo puedo solucionarlo?
Editar:Agregar --allow-releaseinfo-change
al apt update -y
archivo acoplable solucionó el problema, pero aún así me gustaría saberlo.por quéfalló sin?
Nota:La pregunta se movió de SO ya que aparentemente está fuera de tema allí... Avíseme si también está fuera de tema aquí.
Respuesta1
TL;DR
La raíz del problema es un error en la imagen base que estás usando. La solución permanente es borrar /var/lib/apt/lists
el Dockerfile de la imagen base, pero se puede solucionar temporalmente reconstruyendo la imagen base o usando la --allow-releaseinfo-change
opción.
La razón por la que este comportamiento difiere entre docker build
y docker run -it
es el uso de la -t
bandera para asignar un tty. Esto cambia el comportamiento de apt -y
( APT::Get::Assume-Yes
).
Explicación completa
Repositorio... cambió su valor 'Suite'
Este error ocurre cuando:
- APT tiene una versión en caché del archivo de lanzamiento.Este es el error. Las imágenes base de Docker generalmente deberían limpiar este caché.
- El repositorio remoto tiene una versión más nueva.
- Ciertos campos no coinciden entre las dos versiones.
En un entorno sin Docker,este cheque está destinadopara proteger al usuario de la instalación repentina e inesperada de paquetes de una versión diferente de Debian.
En este caso, la imagen base mcr.microsoft.com/azure-functions/python:3.0-python3.9
contiene contenidoVersiones en caché de los archivos de lanzamiento de Debian Buster.(condición #1) con Suite: stable
, porque estaba vigente en el momento en que se construyó.
Sin embargo, la copia maestra en elEl archivo de Debian es más nuevo(condición #2), y ahora tiene Suite: oldstable
(condición #3), porque Debian 10 buster ha sidoreemplazadopor la diana de Debian 11.
Entonces, cuando intentas ejecutar apt update
esta imagen base, falla debido a ladiscordanciaentre la versión anterior en caché y la versión actual.
Probé su Dockerfile hace un momento (03/09/2021) y funcionó bien para mí. Probablemente esto se deba a que se reconstruyó desde que publicó esta pregunta. Esto habría provocado que almacenara en caché los nuevos archivos de la versión del archivo de Debian, corrigiendo la discrepancia (los números 2 y 3 anteriores ya no son ciertos).
Sin embargo, puedes verificar que el error sigue ahí:
$ 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
Y el mismo error se repetirá después de la próxima versión de Debian, cuando buster se convierta oldoldstable
y bullseye se convierta en oldstable
.
Recientemente vi un problema similar con una imagen base de Docker no relacionada y creo que este error está bastante extendido.
Comportamiento de -y
opción
Cuando ejecuta apt
un tty como stdin, -y
anulará esta verificación y permitirá que el update
comando se ejecute correctamente. Sin embargo, si no hay tty (sesión no interactiva), la -y
opciónno anularáeste cheque. Confirmé esto usando una versión anterior de la imagen con errores:
# 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