Debian 10 Docker构建镜像GPG密钥验证失败怎么办?
2024-07-18 15:47:38
Debian 10 上 Docker 构建镜像 GPG 密钥验证失败的解决方案
在 Debian 10 系统上使用 docker-compose build
构建 Docker 镜像时,你可能会遇到 "GPG error: http://deb.debian.org/debian bookworm InRelease: The following signatures couldn't be verified because the public key is not available" 这样的错误信息。这个问题的根源在于系统缺少 Debian 软件仓库的 GPG 公钥。
你可能已经尝试过使用 apt-key adv
命令获取缺失的密钥,却发现系统提示密钥未更改。这很可能是因为系统中已经存在了对应密钥的旧版本,而 apt-key adv
命令默认不会覆盖已存在的密钥。
为了解决这个问题,我们可以采取一些更有针对性的方法:
方法一:强制更新 GPG 密钥
我们可以使用以下命令强制更新所有 GPG 密钥:
sudo apt-key update --recv-keys
这个命令会尝试从所有已知的密钥服务器上更新 GPG 密钥,并强制覆盖已存在的密钥,就像给你的密钥库来了一次彻底的“大扫除”。
方法二:手动添加 GPG 密钥
如果强制更新 GPG 密钥无效,我们可以尝试手动添加缺失的 GPG 密钥,就像我们自己去“取快递”一样。
首先,我们需要从 Debian 密钥服务器上获取对应版本的密钥文件。访问 https://keys.debian.org/ 网站,搜索并下载缺失的密钥文件。
例如,要下载密钥 ID 为 0E98404D386FA1D9
的密钥文件,你可以访问 https://keys.debian.org/pks/lookup?op=get&search=0x0E98404D386FA1D9 。
下载完成后,使用以下命令将密钥文件添加到系统中:
sudo apt-key add <密钥文件路径>
例如,如果下载的密钥文件名为 debian-archive-keyring.gpg
,则可以使用以下命令添加密钥:
sudo apt-key add debian-archive-keyring.gpg
方法三:更新软件包列表并重试
完成以上步骤后,我们需要更新软件包列表,就像我们整理好“快递”后,需要更新一下“库存清单”一样:
sudo apt update
最后,再次尝试使用 docker-compose build
命令构建 Docker 镜像。
仍然遇到问题?
如果以上方法都无法解决问题,你可以尝试以下操作:
- 检查网络连接: 确保你的网络连接正常,能够访问 Debian 软件仓库和密钥服务器,就像确保你的“快递”运输路线畅通无阻一样。
- 尝试其他 GPG 密钥服务器: 就像我们也可以选择其他的“快递公司”一样,尝试使用其他 GPG 密钥服务器,例如
keyserver.ubuntu.com
。 - 检查系统时间: 检查系统时间是否正确,如果系统时间与密钥服务器的时间相差过大,也会导致验证失败。这就像“快递”的时间和你的时间不一致,也会导致“收不到货”。
常见问题解答
1. 为什么会出现 GPG 密钥验证失败的问题?
这是因为系统在验证软件包的数字签名时,找不到对应的 GPG 公钥,无法确认软件包的来源和完整性。
2. apt-key update
和 apt-key adv
有什么区别?
apt-key update
用于更新所有已知的 GPG 密钥,而 apt-key adv
用于添加新的 GPG 密钥或更新指定的 GPG 密钥。
3. 如何找到缺失的 GPG 密钥 ID?
在错误信息中,通常会显示缺失的 GPG 密钥 ID。例如,在错误信息 "GPG error: http://deb.debian.org/debian bookworm InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY <密钥 ID>" 中,<密钥 ID>
就是缺失的 GPG 密钥 ID。
4. 如何验证 GPG 密钥是否已成功添加?
可以使用 apt-key list
命令列出所有已添加的 GPG 密钥。
5. 为什么手动添加 GPG 密钥后,还需要更新软件包列表?
因为更新软件包列表会同步软件仓库的最新信息,包括 GPG 密钥的信息,这样系统才能识别新添加的 GPG 密钥。
希望以上信息能够帮助你解决在 Debian 10 上构建 Docker 镜像时遇到的 GPG 密钥验证失败问题。