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
但:
- 如果我在啟動後執行完全相同的兩個命令
docker run --rm -it --entrypoint bash mcr.microsoft.com/azure-functions/python:3.0-python3.9
,apt update -y
工作正常,- 如果我將
debian:buster-slim
圖像所基於的基礎圖像更改為,docker build 工作正常,- 即使命令失敗,我也可以從 安裝包
testing
,例如,apt update -y || apt install g++
將安裝而不是Busterg++-10
上的預設安裝。g++-8
知道命令失敗的原因嗎?
我該如何解決?編輯:添加
--allow-releaseinfo-change
到apt update -y
dockerfile 解決了這個問題,但我仍然想知道為什麼它沒有失敗?**注意:**問題從 SO 轉移,因為它在那裡顯然是題外話……讓我知道它是否在這裡也是題外話。
TL;博士
根本問題是您正在使用的基礎映像中的錯誤。永久修復是
/var/lib/apt/lists
在基礎鏡像 Dockerfile 中清除,但可以通過重建基礎鏡像或使用--allow-releaseinfo-change
選項來臨時解決。這種行為之所以不同
docker build
,docker run -it
是因為使用了-t
標誌來分配一個 tty。這改變了apt -y
(APT::Get::Assume-Yes
) 的行為。完整解釋
儲存庫…更改了其“套件”值
在以下情況下會發生此錯誤:
- APT 有一個發布文件的記憶體版本——這是錯誤。Docker 基礎鏡像通常應該清理這個記憶體。
- 遠端倉庫有更新的版本
- 兩個版本之間的某些欄位不匹配
在非 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