apt update отличается поведением в Dockerfile и подсказке, возвращает код ошибки 100, но работает

apt update отличается поведением в Dockerfile и подсказке, возвращает код ошибки 100, но работает

Я пытаюсь установить apt-источник на функцию Microsoft Azure Docker, вот мой 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

Это приводит к сбою на apt update -yшаге со следующей ошибкой

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

Но:

  • если я запускаю те же самые две команды после запуска docker run --rm -it --entrypoint bash mcr.microsoft.com/azure-functions/python:3.0-python3.9, apt update -yработает нормально,
  • если я изменю базовый образ на debian:buster-slimтот, на котором основан образ, сборка Docker будет работать нормально,
  • даже если команда не выполняется, я могу установить пакет из testing, например, apt update -y || apt install g++установит g++-10вместо пакета по умолчанию g++-8в Buster.

Есть идеи, почему команда не выполняется? И как это исправить?


Редактировать:Добавление --allow-releaseinfo-changeв apt update -ydockerfile решило проблему, но я все равно хотел бы знатьпочемубез него не получилось?


Примечание:Вопрос перенесен из SO, поскольку там он явно не по теме... Дайте мне знать, если здесь он также не по теме.

решение1

TL;DR

Корневая проблема — ошибка в базовом образе, который вы используете. Постоянное исправление — очистка /var/lib/apt/listsDockerfile в базовом образе, но ее можно временно обойти, перестроив базовый образ или используя опцию --allow-releaseinfo-change.

Причина, по которой это поведение отличается между docker buildи docker run -it— использование -tфлага для выделения tty. Это изменяет поведение apt -y( APT::Get::Assume-Yes).

Полное объяснение

Репозиторий ... изменил свое значение «Suite»

Эта ошибка возникает, когда:

  1. У APT есть кэшированная версия файла Release —Это ошибка. Базовые образы Docker должны, как правило, очищать этот кэш.
  2. Удаленный репозиторий имеет более новую версию
  3. Некоторые поля не совпадают в двух версиях.

В среде без докераэта проверка предназначенадля защиты пользователя от внезапной и неожиданной установки пакетов из другого выпуска Debian.

В этом случае базовое изображение mcr.microsoft.com/azure-functions/python:3.0-python3.9 содержит содержащиесяКэшированные версии файлов Debian Buster Release(условие №1) с Suite: stable, поскольку оно было актуальным на момент его создания.

Однако мастер-копия вАрхив Debian новее(условие №2), а теперь и Suite: oldstable(условие №3), потому что Debian 10 buster былзамененпо Debian 11 в яблочко.

Итак, когда вы пытаетесь запустить apt updateэтот базовый образ, он терпит неудачу из-занесоответствиемежду старой кэшированной версией и текущей версией.

Я только что попробовал ваш Dockerfile (2021-09-03), и он у меня нормально работал. Вероятно, это потому, что он был перестроен с тех пор, как вы разместили этот вопрос. Это заставило бы его кэшировать новые файлы Release из архива Debian, исправив несоответствие (#2/#3 выше больше не верны).

Однако вы можете убедиться, что ошибка все еще существует:

$ 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

И та же ошибка повторится после следующего релиза Debian, когда buster станет , oldoldstableа bullseye станет oldstable.

Недавно я столкнулся с похожей проблемой с другим образом Docker Base, и я думаю, что эта ошибка довольно распространена.

Поведение -yопциона

При запуске aptс tty в качестве stdin, -yэта проверка будет отменена и updateкоманда будет выполнена успешно. Однако, если tty отсутствует (неинтерактивный сеанс), -yопцияне будет переопределятьэта проверка. Я подтвердил это, используя более старую версию глючного изображения:

# 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

Связанный контент