Рейтинг:3

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

флаг kr

Я пытаюсь установить подходящий исходный код в докер функции Microsoft Azure, вот мой файл Dockerfile

ОТ 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

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

ВНИМАНИЕ: у apt нет стабильного интерфейса командной строки. Используйте с осторожностью в сценариях.

Получить:1 http://deb.debian.org/debian buster InRelease [122 КБ]
Получите:2 http://security.debian.org/debian-security buster/updates InRelease [65,4 КБ]
Попадание: 3 http://security.debian.org/debian-security jessie/updates InRelease
Получить:4 http://deb.debian.org/debian buster-updates InRelease [51,9 КБ]
Получите: 5 https://packages.microsoft.com/debian/9/prod stretch InRelease [4009 B]
Получить:6 http://deb.debian.org/debian testing InRelease [112 КБ]
Получите: 7 https://packages.microsoft.com/debian/9/prod stretch/main amd64 Packages [161 kB]
Получить: 8 http://deb.debian.org/debian testing/main amd64 Packages [8248 kB]
Чтение списков пакетов...
E: Репозиторий «http://security.debian.org/debian-security buster/updates InRelease» изменил значение «Suite» со «стабильного» на «старый стабильный».
E: Репозиторий «http://deb.debian.org/debian buster InRelease» изменил значение «Suite» со «стабильного» на «старый стабильный».
E: Репозиторий «http://deb.debian.org/debian buster-updates InRelease» изменил значение «Suite» с «stable-updates» на «oldstable-updates».
Команда '/bin/sh -c apt update -y' вернула ненулевой код: 100

Но:

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

Любая идея, почему команда терпит неудачу? И как я могу это исправить?


Редактировать: Добавление --allow-releaseinfo-change к удачное обновление -y в dockerfile исправлена ​​проблема, но я все равно хотел бы знать Почему это не удалось без?


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

Michael Hampton avatar
флаг cz
Эти подходящие репозитории - полный беспорядок. Кто создал этот контейнер, который вы используете в качестве базы? Не удивлюсь, если на нем ничего не работает.
флаг kr
@MichaelHampton Это официальное изображение для докеризированной функции приложения Python в Azure. Dockerfile можно найти здесь https://github.com/Azure/azure-functions-docker/blob/dev/host/3.0/buster/amd64/python/python39/python39.Dockerfile.
Рейтинг:3
флаг br

TL;DR

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

Причина, по которой это поведение различается между сборка докера и докер запустить -это это использование флаг для выделения tty. Это меняет поведение подходящий -y (APT::Get::Предположим-Да).

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

Репозиторий... изменил значение "Suite"

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

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

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

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

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

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

Я попробовал ваш 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: растянуть
/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 станет старый стабильный и яблочко становится старая конюшня.

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

Поведение вариант

Когда вы бежите подходящий с tty как стандартный ввод, переопределит эту проверку и позволит Обновить команду добиться успеха. Однако, если нет tty (неинтерактивного сеанса), вариант не переопределит этот чек. Я подтвердил это, используя более старую версию образа с ошибками:

# прерывает    
docker run --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update -y

# успешно
docker run -t --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update -y

# подсказывает, что да/нет, чтобы продолжить
docker run -it --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update

# прерывает
docker run --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update
флаг kr
Спасибо за ответ, это не объясняет, почему код отлично работает при запуске непосредственно в контейнере, а не в Dockerfile, есть идеи?
флаг br
У меня он отлично работает в обоих случаях (сборка докера и запуск докера), потому что образ был обновлен. Можете ли вы все еще воспроизвести это, и если да, можете ли вы опубликовать вывод «docker image ls mcr.microsoft.com/azure-functions/python:3.0-python3.9» (в частности, идентификатор изображения)?
флаг kr
К сожалению, я также обновил изображение, поэтому больше не могу воспроизводить... Если я найду конкретный идентификатор изображения, который не работает, я дам вам знать.
флаг br
Я нашел старую версию изображения и смог воспроизвести поведение. Добавлено объяснение

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.