Debian

apt update Dockerfile 中的不同行為並提示,返回錯誤程式碼 100 但有效

  • September 8, 2021

我正在嘗試在 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

但:

  • 如果我在啟動後執行完全相同的兩個命令docker run --rm -it --entrypoint bash mcr.microsoft.com/azure-functions/python:3.0-python3.9apt update -y工作正常,
  • 如果我將debian:buster-slim圖像所基於的基礎圖像更改為,docker build 工作正常,
  • 即使命令失敗,我也可以從 安裝包testing,例如,apt update -y || apt install g++將安裝而不是Busterg++-10上的預設安裝。g++-8

知道命令失敗的原因嗎?我該如何解決?


編輯:添加--allow-releaseinfo-changeapt update -ydockerfile 解決了這個問題,但我仍然想知道為什麼它沒有失敗?


**注意:**問題從 SO 轉移,因為它在那裡顯然是題外話……讓我知道它是否在這裡也是題外話。

TL;博士

根本問題是您正在使用的基礎映像中的錯誤。永久修復是/var/lib/apt/lists在基礎鏡像 Dockerfile 中清除,但可以通過重建基礎鏡像或使用--allow-releaseinfo-change選項來臨時解決。

這種行為之所以不同docker builddocker run -it是因為使用了-t標誌來分配一個 tty。這改變了apt -y( APT::Get::Assume-Yes) 的行為。

完整解釋

儲存庫…更改了其“套件”值

在以下情況下會發生此錯誤:

  1. APT 有一個發布文件的記憶體版本——這是錯誤。Docker 基礎鏡像通常應該清理這個記憶體。
  2. 遠端倉庫有更新的版本
  3. 兩個版本之間的某些欄位不匹配

在非 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 Bullseye取代。

因此,當您嘗試apt update在此基礎映像上執行時,由於舊記憶體版本與目前版本之間的不匹配,它會失敗。

我剛剛嘗試了您的 Dockerfile(2021-09-03),它對我來說工作正常。這可能是因為自您發布此問題以來它已被重建。這會導致它記憶體來自 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 基礎鏡像類似的問題,我認為這個 bug 相當普遍。

-y選項的行為

當您apt使用 tty 作為標準輸入執行時,-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

引用自:https://serverfault.com/questions/1075729