apt actualiza un comportamiento diferente en Dockerfile y solicita, devuelve el código de error 100 pero funciona

apt actualiza un comportamiento diferente en Dockerfile y solicita, devuelve el código de error 100 pero funciona

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 -ypaso 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 -yfunciona bien,
  • si cambio la imagen base en debian:buster-slimla 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++-10en lugar del predeterminado g++-8en Buster.

¿Alguna idea de por qué falla el comando? ¿Y cómo puedo solucionarlo?


Editar:Agregar --allow-releaseinfo-changeal apt update -yarchivo 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/listsel Dockerfile de la imagen base, pero se puede solucionar temporalmente reconstruyendo la imagen base o usando la --allow-releaseinfo-changeopción.

La razón por la que este comportamiento difiere entre docker buildy docker run -ites el uso de la -tbandera 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:

  1. 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é.
  2. El repositorio remoto tiene una versión más nueva.
  3. 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 updateesta 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 oldoldstabley 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 -yopción

Cuando ejecuta aptun tty como stdin, -yanulará esta verificación y permitirá que el updatecomando se ejecute correctamente. Sin embargo, si no hay tty (sesión no interactiva), la -yopció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

información relacionada