
Я пытаюсь установить 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 -y
dockerfile решило проблему, но я все равно хотел бы знатьпочемубез него не получилось?
Примечание:Вопрос перенесен из SO, поскольку там он явно не по теме... Дайте мне знать, если здесь он также не по теме.
решение1
TL;DR
Корневая проблема — ошибка в базовом образе, который вы используете. Постоянное исправление — очистка /var/lib/apt/lists
Dockerfile в базовом образе, но ее можно временно обойти, перестроив базовый образ или используя опцию --allow-releaseinfo-change
.
Причина, по которой это поведение отличается между docker build
и docker run -it
— использование -t
флага для выделения tty. Это изменяет поведение apt -y
( APT::Get::Assume-Yes
).
Полное объяснение
Репозиторий ... изменил свое значение «Suite»
Эта ошибка возникает, когда:
- У APT есть кэшированная версия файла Release —Это ошибка. Базовые образы Docker должны, как правило, очищать этот кэш.
- Удаленный репозиторий имеет более новую версию
- Некоторые поля не совпадают в двух версиях.
В среде без докераэта проверка предназначенадля защиты пользователя от внезапной и неожиданной установки пакетов из другого выпуска 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