apt update は Dockerfile とプロンプトで異なる動作をし、エラー コード 100 を返しますが、動作します。

apt update は Dockerfile とプロンプトで異なる動作をし、エラー コード 100 を返しますが、動作します。

Microsoft Azure Function Dockerにaptソースをインストールしようとしています。ここに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

しかし:

  • 起動後にまったく同じ2つのコマンドを実行するとdocker run --rm -it --entrypoint bash mcr.microsoft.com/azure-functions/python:3.0-python3.9apt update -y正常に動作します。
  • ベースイメージをdebian:buster-slimイメージのベースに変更すると、dockerビルドは正常に動作します。
  • コマンドが失敗した場合でも、 からパッケージをインストールできますtesting。たとえば、Buster のデフォルトの代わりにapt update -y || apt install g++がインストールされます。g++-10g++-8

コマンドが失敗する理由をご存知ですか?また、どうすれば修正できますか?


編集:dockerfileに追加することで問題は解決しましたが、まだ知りたいことが--allow-releaseinfo-changeありますapt update -yなぜ失敗しなかったのですか?


注記:どうやら SO ではトピック外なので、質問は SO から移動されました... ここでもトピック外であればお知らせください。

答え1

要約

根本的な問題は、使用しているベース イメージのバグです。永続的な修正は、ベース イメージの Dockerfile でクリアすることです/var/lib/apt/listsが、ベース イメージを再構築するか、オプションを使用することで一時的に回避できます--allow-releaseinfo-change

と の間でこの動作が異なる理由はdocker build、 tty を割り当てるために フラグdocker run -itが使用されるためです。これにより、 ( )-tの動作が変わります。apt -yAPT::Get::Assume-Yes

詳しい説明

リポジトリ...の「スイート」値が変更されました

このエラーは次の場合に発生します:

  1. APT にはリリースファイルのキャッシュバージョンがあります --これがバグです。Docker ベース イメージでは通常、このキャッシュをクリーンアップする必要があります。
  2. リモートリポジトリには新しいバージョンがあります
  3. 2つのバージョン間で特定のフィールドが一致しません

非Docker環境では、このチェックはユーザーが突然、予期せず別の Debian リリースからパッケージをインストールしてしまうのを防ぐためです。

この場合、ベースイメージmcr.microsoft.com/azure-functions/python:3.0-python3.9 Debian buster リリースファイルのキャッシュバージョン(条件 #1) はSuite: stable、構築された時点では最新だったためです。

しかし、Debianアーカイブは新しい(条件2)となり、Suite: oldstableDebian 10 busterがリリースされたため、(条件3)となりました。置き換えられたDebian 11 bullseye より。

apt updateこのベースイメージで実行しようとすると、ミスマッチ古いキャッシュバージョンと現在のバージョンの間。

先ほど (2021-09-03) の Dockerfile を試してみましたが、問題なく動作しました。これは、この質問を投稿してから再構築されたためと思われます。これにより、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

oldoldstableそして、次の Debian リリースで buster が になり、 bullseye が になったときにも、同じエラーが再発しますoldstable

最近、無関係な Docker ベース イメージで同様の問題が発生しましたが、このバグはかなり広範囲に及んでいると思います。

-yオプションの動作

aptttyを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

関連情報