mor*_*tar 38 ubuntu apt-get docker ubuntu-22.04
我正在尝试将我们的 docker 基础映像之一升级到 Ubuntu 的最新稳定版本。我已将问题隔离为一个简单的可重现案例。我有一个像这样的 Dockerfile:
FROM ubuntu:22.04
MAINTAINER mep-dev@zulily.com
# Install java and clean-up
RUN apt-get update
Run Code Online (Sandbox Code Playgroud)
当我在本地计算机上构建它时,没有任何问题。然而,当我在 CICD 上构建它时,有时会出现以下错误:
步骤 3/3:运行 apt-get update
---> 在 6ca01b60de64 中运行
Get:1 http://archive.ubuntu.com/ubuntu jammy InRelease [270 kB]
Get: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]
Err:1 http://archive.ubuntu.com/ubuntu jammy InRelease
由于公钥不可用,无法验证以下签名: NO_PUBKEY 871920D1991BC93C
Err:3 http://archive.ubuntu.com/ ubuntu jammy-updates InRelease
无法验证以下签名,因为公钥不可用: NO_PUBKEY 871920D1991BC93C
Err:4 http://archive.ubuntu.com/ubuntu jammy-backports InRelease
无法验证以下签名,因为公钥不可用:NO_PUBKEY 871920D1991BC93C
Err:2 http://security.ubuntu.com/ubuntu jammy-security InRelease
由于公钥不可用,无法验证以下签名:NO_PUBKEY 871920D1991BC93C
正在读取软件包列表.. .
W: http://archive.ubuntu.com/ubuntu/dists/jammy/InRelease:密钥环 /etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gpg 中的密钥是被忽略,因为执行 apt-key 的用户“_apt”无法读取该文件。
W: http: //archive.ubuntu.com/ubuntu/dists/jammy/InRelease:密钥环 /etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg 中的密钥被忽略因为执行 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.gpg 中的密钥被忽略,因为执行 apt-key 的用户“_apt”无法读取该文件。
W: http: //archive.ubuntu.com/ubuntu/dists/jammy-updates/InRelease:密钥环 /etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg 中的密钥被忽略,因为执行 apt-key 的用户“_apt”无法读取该文件。
W:GPG错误: http: //archive.ubuntu.com/ubuntujammy-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-cdimage.gpg 中的密钥被忽略,因为执行 apt-key 的用户“_apt”无法读取该文件。
W: http: //archive.ubuntu.com/ubuntu/dists/jammy-backports/InRelease:密钥环 /etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg 中的密钥被忽略,因为执行 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.gpg 中的密钥被忽略,因为执行 apt-key 的用户“_apt”无法读取该文件。
W: http: //security.ubuntu.com/ubuntu/dists/jammy-security/InRelease:密钥环 /etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg 中的密钥被忽略,因为执行 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 || true'
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 root root 2794 Mar 26 2021 ubuntu-keyring-2012-cdimage.gpg
-rw-r --r-- 1 root 1733 Mar 26 2021 ubuntu-keyring-2018-archive.gpg
我还检查了父目录,它们至少都有 rx。
这个答案可能是相关的,但是当基础映像在一种环境中使用而不是在另一种环境中使用时,为什么文件具有正确的结构?
更新:
通过使用--pull,我可以看到它正在使用的确切图像。
$ docker build --pull -t $EMAIL_DELIVERABILITY_ARN 。
步骤 1/3 :从 ubuntu:22.04
22.04:从库/ubuntu 摘要中提取
:sha256:b6b83d3c331794420340093eb706a6f152d9c1fa51b262d9bf34594887c2c7ac
状态:为 ubuntu:22.04 下载较新的映像
--- > 27941809078c
这与我在本地构建时看到的 sha 和图像 id 相同,有效。
我在 ubuntu:20.04 上没有遇到同样的问题。
Wik*_*ver 36
在花了半天时间尝试修复 Ubuntu 映像(没有损坏)后,我最终开始调试主机。
这是一个docker问题。Ubuntu 利用系统调用来提高密钥安全性,而 Docker 尚不支持。解决方案是更新 docker ...或使用 nerdctl、runc 或类似的东西。
它不会apt收到系统调用不受支持的消息,而是收到权限被拒绝的消息,这会导致令人困惑的错误消息。
您可以从技术上修补 ubuntu 以降低安全性,并与较旧的 docker 一起使用,但遗憾的是这不是一个长期解决方案。
这是 Docker(/moby) 项目中修复该问题的 PR。请注意,该问题也可能出现在其他 Docker 映像(或 Ubuntu 中的其他软件)中,因为它最终是由glibc 的更改导致的,该更改与 Docker 的默认 seccomp 配置文件不兼容。
ine*_*iti 11
对于一些 docker 黑客来说,一个非常肮脏但可能可以接受的黑客是这样的:
apt update --allow-insecure-repositories
Run Code Online (Sandbox Code Playgroud)
这只是忽略了签名。错误仍然会打印,但包存储库已更新,您可以随后安装新包。即使你会被警告并询问这是否真的是你想做的。
当您按名称引用 docker 映像时,Docker 只会检查它是否在本地存在 - 它不会检查更新。因此,如果已经有一个可用的命名图像版本,它将使用该版本,即使它可能已经过时。我怀疑这就是您所看到的:您的某些 CI 节点必须具有有问题的图像的缓存版本。
有几种方法可以解决这个问题:
docker pull ubuntu:22.04在调用之前明确表示docker run;这将拉取更新版本的映像(如果存在)。
添加--pull always到您的docker run命令行。这可以完成同样的事情,但不需要执行额外的命令。
通过摘要而不是通过标签引用图像。如果您使用这样的图像参考:
FROM ubuntu@sha256:bace9fb0d5923a675c894d5c815da75ffe35e24970166a48a4460a48ae6e0d19
Run Code Online (Sandbox Code Playgroud)
然后 docker 将使用该确切的映像。您可以在 docker hub 上找到图像摘要。
| 归档时间: |
|
| 查看次数: |
28131 次 |
| 最近记录: |