需要手动添加密钥吗?由于公钥不可用,以下签名无法验证:NO_PUBKEY。

我正在尝试在Docker中使用Ubuntu 20.04或Ubuntu 22.04。我的Dockerfile如下:
from ubuntu:22.04
run DEBIAN_FRONTEND=noninteractive apt update

我用docker build .命令构建了这个。结果如下:
Sending build context to Docker daemon  2.048kB
Step 1/2 : from ubuntu:22.04
---> 2dc39ba059dc
Step 2/2 : run DEBIAN_FRONTEND=noninteractive apt update
---> Running in b15002ae9dd5

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
Get:1 http://archive.ubuntu.com/ubuntu jammy InRelease [270 kB] 
Get:2 http://security.ubuntu.com/ubuntu jammy-security 
InRelease [110 kB] 
Get:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [114 kB] 
Get:4 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [99.8 kB] Err:1 http://archive.ubuntu.com/ubuntu jammy InRelease   
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 871920D1991BC93C 

我会一遍又一遍地收到这条消息,直到我收到:
W: http://archive.ubuntu.com/ubuntu/dists/jammy/InRelease: The key(s) in the keyring /etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gpg are ignored as the file is not readable by user '_apt' executing apt-key.

我尝试在Dockerfile中的第一个运行命令中使用chmod a+rwx /etc/apt -R,但没有任何效果。
我还明确运行了docker pull ubuntu:22.04,它显示已经是最新版本。我对ubuntu:20.04镜像也遇到了完全相同的问题。
我查阅了所有其他涉及此问题的网络资源,但它们都要求我能够运行apt install apt-key或其他命令,但由于无法更新apt,所以什么都不起作用。除此之外,搜索引擎的前三页只显示如何在Ubuntu上安装Docker,而不是反过来。
我还尝试了另一个答案中提到的--security-opt seccomp:unconfined。结果回应为Error response from daemon: The daemon on this platform does not support setting security options on build
所以我的镜像没有curl,wget或gnupg,我无法在不解决此问题的情况下安装它。当我使用apt-key执行任何操作时,我会得到以下错误信息:E: gnupg、gnupg2和gnupg1似乎未安装,但其中一个是此操作所需的。
我已经成功手动安装了gnupg的deb文件,并手动接收了密钥,但仍然出现类似的错误消息。
# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 871920D1991BC93C
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
Executing: /tmp/apt-key-gpghome.rQuYmKpjpo/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys 871920D1991BC93C
gpg: requesting key 991BC93C from hkp server keyserver.ubuntu.com
gpg: key 991BC93C: public key "Ubuntu Archive Automatic Signing Key (2018) <ftpmaster@ubuntu.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA:  1)
W: The key(s) in the keyring /etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg are ignored as the file is not readable by user '' executing apt-key.

我也尝试过将/etc/apt/source.list修剪到最小限度,但问题依然存在。

我该如何从主机中添加所需的密钥?

作为一个次要问题,这样一个主流工具和发行版怎么会出现问题呢?或者是我做了什么明显愚蠢的错误?大家是否已经转向其他工具,如果是,那是什么?由于网络访问不佳,我很难及时了解计算机世界的最新动态。


我正在尝试在Docker内部的Ubuntu镜像上构建一些东西。两者都使用相同的ubuntu:22.04和ubuntu:20.04版本。Dockerhub上没有ubuntu:20镜像。Ubuntu是否已经完成,我应该回到Debian吗? - WikiLover
你在主机系统上使用的是哪个操作系统?原因是在某些版本的Docker中,这个问题在MacOS和/或Windows上会出现,更新主机上的Docker本身可以解决这个问题。尤其是在MacOS 12.x上使用Docker engine 20.10.14及更低版本时,问题尤为严重。 - matigo
4个回答

你一直在试图解决错误的问题。
从Ubuntu 20开始,Ubuntu使用更安全的系统调用,在旧版本的docker上会导致权限错误而不是“不支持”错误,从而产生误导性的错误消息。虽然可以在Ubuntu镜像中进行修补,但这会使它们变得不太安全,因此不是长期解决方案。
最简单的解决办法是更新docker。
一个不可持续的替代方案是暂时回退到ubuntu:18.04。

嗯,我有最新版本的Podman,而且Podman比Docker更安全。我想知道那些系统调用可能是什么。另外,我在ubuntu 20.04镜像上没有同样的问题,尽管作者声称在那里也可以复现。奇怪,同样的错误可能有不同的原因吗? - Hi-Angel
1尝试了2个小时的其他解决方案后,我找到了这个答案,并升级了我的Docker。然后...成功了!非常感谢@WikiLover。 - Trent
@Hi-Angel 这个应该可以:podman run --rm --security-opt seccomp=unconfined -it ubuntu:22.04 /bin/bash - WikiLover

在使用树莓派(armhf)构建基于ubuntu:22.04的镜像时,我遇到了一个类似的问题。问题出在宿主机的libseccomp库上。
解决方案已记录在这里:https://docs.linuxserver.io/faq
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 04EE7237B7D453EC 648ACFD622F3D138
echo "deb http://deb.debian.org/debian buster-backports main" | sudo tee -a /etc/apt/sources.list.d/buster-backports.list
sudo apt update
sudo apt install -t buster-backports libseccomp2

重启后,我可以顺利运行apt-get update,没有出现错误。

我没有研究这个问题的确切原因,但是有一个方法可以帮助解决,就是使用--security-opt seccomp=unconfined选项来运行。我在Podman实现的Docker工具上进行了测试,这个方法也适用于原始的docker
 λ podman run --rm --security-opt seccomp=unconfined -it ubuntu:22.04 /bin/bash                     
root@1e910696dd09:/# apt update
Get:1 http://archive.ubuntu.com/ubuntu jammy InRelease [270 kB]
Get:2 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]            
Get:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [114 kB]              
Get:4 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [99.8 kB]
Get:5 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages [1792 kB]
Get:6 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages [578 kB]
Get:7 http://security.ubuntu.com/ubuntu jammy-security/restricted amd64 Packages [480 kB]
Get:8 http://security.ubuntu.com/ubuntu jammy-security/multiverse amd64 Packages [4644 B]
Get:9 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages [756 kB]
Get:10 http://archive.ubuntu.com/ubuntu jammy/restricted amd64 Packages [164 kB]
Get:11 http://archive.ubuntu.com/ubuntu jammy/multiverse amd64 Packages [266 kB]        
Get:12 http://archive.ubuntu.com/ubuntu jammy/universe amd64 Packages [17.5 MB]           
Get:13 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [880 kB]         
Get:14 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [939 kB]
Get:15 http://archive.ubuntu.com/ubuntu jammy-updates/multiverse amd64 Packages [16.9 kB]
Get:16 http://archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages [528 kB]
Get:17 http://archive.ubuntu.com/ubuntu jammy-backports/universe amd64 Packages [7290 B]
Get:18 http://archive.ubuntu.com/ubuntu jammy-backports/main amd64 Packages [3175 B]
Fetched 24.5 MB in 6s (4365 kB/s)                
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
root@1e910696dd09:/#

在同一个老的docker上:守护程序的错误响应:此平台上的守护程序不支持在构建过程中设置安全选项。 - WikiLover

不是解决方案,而是给那些只想快速完成任务以进行快速学习/实验目的的人的建议。如上所述,这些错误是由于改进的Ubuntu系统调用和您的Docker版本过旧引起的。

您可以将Ubuntu镜像降级从ubuntu:latest改为ubuntu:18.04,然后一切应该按预期工作。


升级Docker(1个软件包)比降级Ubuntu(200多个软件包)要容易得多。 - undefined