簡體   English   中英

Ubuntu 22 基礎 docker 映像上的 apt-get 更新失敗

[英]apt-get update fails on Ubuntu 22 base docker image

我正在嘗試將我們的 docker 基礎映像之一升級到 Ubuntu 的最新穩定版本。 我已將問題隔離為一個簡單的可重現案例。 我有一個像這樣的 Dockerfile:

FROM ubuntu:22.04

MAINTAINER mep-dev@zulily.com

# Install java and clean-up
RUN apt-get update

當我在本地機器上構建它時,我沒有任何問題。 但是,當我在 CICD 上構建它時,有時會出現以下錯誤:

步驟 3/3:運行 apt-get 更新
---> 在 6ca01b60de64 中運行
獲取:1 http://archive.ubuntu.com/ubuntu jammy InRelease [270 kB]
獲取:2 http://security.ubuntu.com/ubuntu jammy -security InRelease [110 kB]
獲取:3 http://archive.ubuntu.com/ubuntu jammy -updates InRelease [109 kB]
獲取:4 http://archive.ubuntu.com/ubuntu jammy -backports InRelease [99.8 kB]
錯誤:1 http://archive.ubuntu.com/ubuntu jammy InRelease
由於公鑰不可用,無法驗證以下簽名:NO_PUBKEY 871920D1991BC93C
錯誤:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease
由於公鑰不可用,無法驗證以下簽名:NO_PUBKEY 871920D1991BC93C
錯誤:4 http://archive.ubuntu.com/ubuntu jammy-backports InRelease
由於公鑰不可用,無法驗證以下簽名:NO_PUBKEY 871920D1991BC93C
錯誤:2 http://security.ubuntu.com/ubuntu jammy -security InRelease
由於公鑰不可用,無法驗證以下簽名:NO_PUBKEY 871920D1991BC93C
正在閱讀 package 列表...
W: http://archive.ubuntu.com/ubuntu/dists/jammy/InRelease :密鑰環 /etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage 中的密鑰被忽略。因為執行 apt-key 的用戶“_apt”無法讀取該文件。
W: http://archive.ubuntu.com/ubuntu/dists/jammy/InRelease :密鑰環 /etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive 中的密鑰被忽略。因為執行 apt-key 的用戶“_apt”無法讀取該文件。
W:GPG錯誤: http://archive.ubuntu.com/ubuntu jammy InRelease:以下簽名無法驗證,因為公鑰不可用:NO_PUBKEY 871920D1991BC93C
E:存儲庫“http://archive.ubuntu.com/ubuntu jammy InRelease”未簽名。
W: http://archive.ubuntu.com/ubuntu/dists/jammy-updates/InRelease :密鑰環 /etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gimage 中的密鑰被忽略,因為執行 apt-key 的用戶 '_apt' 無法讀取該文件。
W: http://archive.ubuntu.com/ubuntu/dists/jammy-updates/InRelease :密鑰環 /etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive 中的密鑰被忽略,因為執行 apt-key 的用戶 '_apt' 無法讀取該文件。
W:GPG錯誤: http://archive.ubuntu.com/ubuntu jammy -updates InRelease:以下簽名無法驗證,因為公鑰不可用:NO_PUBKEY 871920D1991BC93C
E:存儲庫“http://archive.ubuntu.com/ubuntu jammy-updates InRelease”未簽名。
W: http://archive.ubuntu.com/ubuntu/dists/jammy-backports/InRelease :密鑰環 /etc/apt/trusted.gpg.d/ubuntu-keyring-2012-中的密鑰被忽略,因為執行 apt-key 的用戶 '_apt' 無法讀取該文件。
W: http://archive.ubuntu.com/ubuntu/dists/jammy-backports/InRelease :密鑰環 /etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive 中的密鑰被忽略,因為執行 apt-key 的用戶 '_apt' 無法讀取該文件。
W:GPG 錯誤: http://archive.ubuntu.com/ubuntu jammy -backports InRelease:以下簽名無法驗證,因為公鑰不可用:NO_PUBKEY 871920D1991BC93C
E:存儲庫“http://archive.ubuntu.com/ubuntu jammy-backports InRelease”未簽名。
W: http://security.ubuntu.com/ubuntu/dists/jammy-security/InRelease :密鑰環 /etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage 中的密鑰。被忽略,因為執行 apt-key 的用戶 '_apt' 無法讀取該文件。
W: http://security.ubuntu.com/ubuntu/dists/jammy-security/InRelease :密鑰環 /etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive 中的密鑰。被忽略,因為執行 apt-key 的用戶 '_apt' 無法讀取該文件。
W:GPG錯誤: http://security.ubuntu.com/ubuntu jammy -security InRelease:以下簽名無法驗證,因為公鑰不可用:NO_PUBKEY 871920D1991BC93C
E:存儲庫“http://security.ubuntu.com/ubuntu jammy-security InRelease”未簽名。
E:執行腳本時出現問題 APT::Update::Post-Invoke 'rm -f /var/cache/apt/archives/ .deb /var/cache/apt/archives/partial/ .deb /var/cache/apt/* .bin || 真的'
E:子進程返回錯誤碼
命令“/bin/sh -c apt-get update”返回非零代碼:100

如果我注釋掉RUN apt-get update ,那么它會成功,我可以進入容器並看到/etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gpg/etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg確實存在並且已讀取所有權限:

root@b778220b39d8:/# ls -l /etc/apt/trusted.gpg.d
共 8 個
-rw-r--r-- 1 根 2794 2021 年 3 月 26 日 ubuntu-keyring-2012-cdimage.gpg
-rw-r--r-- 1 根 1733 2021 年 3 月 26 日 ubuntu-keyring-2018-archive.gpg

我還檢查了父目錄,它們至少有 rx。

這個答案可能是相關的,但是當基礎映像用於一個環境而不是另一個環境時,為什么文件會有正確的結構呢?

更新:

通過使用--pull ,我可以看到它正在使用的確切圖像。

$ docker 構建 --pull -t $EMAIL_DELIVERABILITY_ARN。
第 1/3 步:從 ubuntu:22.04
22.04:從庫/ubuntu 中提取
摘要:sha256:b6b83d3c331794420340093eb706a6f152d9c1fa51b262d9bf34594887c2c7ac
狀態:已下載 ubuntu:22.04 的更新圖像
---> 27941809078c

這是我在本地構建時看到的相同 sha 和圖像 ID,它有效。

我對 ubuntu:20.04 沒有同樣的問題。

完全相同的問題

Err:3 http://security.ubuntu.com/ubuntu jammy-security InRelease 由於公鑰不可用,無法驗證以下簽名:NO_PUBKEY 871920D1991BC93C 正在讀取包列表... [91mW: http://archive .ubuntu.com/ubuntu/dists/jammy/InRelease:密鑰環 /etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gpg 中的密鑰被忽略,因為文件無法讀取用戶 '_apt' 執行 apt-key。

Dockerfile (簡單的如何重現) docker-version: 18.x or 19.03/

FROM ubuntu:latest RUN apt-get -y update

使用最新的 Docker 版本 20.10.9,我沒有看到問題。

一些選項試圖解決:

  1. sed -i 's/jammy/focal/g' /etc/apt/sources.list
  2. RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 871920D1991BC93C 這失敗並出現另一個子問題 gnupg、gnupg2 和 gnupg1 似乎沒有安裝,但此操作需要其中一個

因此,解決方案似乎是更新 docker-version 或使用以前工作過的標記圖像。

當您按名稱引用 docker 映像時,Docker 僅檢查它是否在本地存在 - 它不檢查更新。 因此,如果已經有一個可用的命名圖像版本,即使它可能是陳舊的,它也會使用它。 我懷疑這就是您所看到的:您的某些 CI 節點必須具有存在問題的圖像的緩存版本。

有幾種方法可以解決這個問題:

  1. 在調用docker run之前明確docker pull ubuntu:22.04 如果存在,這將拉下一個更新版本的圖像。

  2. --pull always添加到您的 docker docker run命令行。 這完成了同樣的事情,但不需要額外的命令執行。

  3. 通過摘要而不是標簽來引用圖像。 如果您使用這樣的圖像參考:

     FROM ubuntu@sha256:bace9fb0d5923a675c894d5c815da75ffe35e24970166a48a4460a48ae6e0d19

然后 docker 將使用該確切的圖像 您可以在 docker hub 上找到圖像摘要。

我也是一樣,Ubuntu 圖像內部有問題。 問題不是來自 docker 軟件/pkg,而是來自圖像中。

在花了半天時間嘗試修復 Ubuntu 圖像(沒有損壞)之后,我最終開始調試主機。

這是docker問題。 Ubuntu 使用系統調用來提高密鑰安全性,而 Docker 尚不支持。 解決方案是更新 docker... 或使用 runc 或類似的東西。

它不是很apt得到不支持系統調用的消息,而是得到權限被拒絕的消息,這會導致令人困惑的錯誤消息。

您可以在技術上修補 ubuntu 以降低安全性,並與較舊的 docker 一起使用,但遺憾的是這不是一個長期的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM