本文介绍使用python-slim执行apt-get update时候碰到的GPG error问题。
- 现象描述
基于如下Dockerfile构建目标镜像
1 | FROM python:3.12-slim |
碰到类似如下描述的问题
1 | W: 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 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131 NO_PUBKEY F8D2585B8783D481 |
- 原因
It is Docker with libseccomp so a newer syscall used in Debian Bookworm packages/libs is being blocked. libseccomp lets you configure allowed syscalls for a process. Docker sets a default seccomp profile for all containers such that only certain syscalls are allowed and everything else is blocked (so, newer syscalls that are not yet known to libseccomp or docker are blocked).
python:3.9 - Failed run apt update from the last version of the image #837
简单解释就是:未固定发行版的 slim 标签会随时间变化。当基础版本切换到 Bookworm,而宿主 Docker/libseccomp 较旧时,新系统调用可能被屏蔽,从而造成这次遇到的报错。不过,单凭 NO_PUBKEY 还不能确定原因,排查时也要核对宿主版本、镜像及其 keyring 配置。
- 解决方案
首选方案是更新运行容器的宿主 Docker 和 libseccomp;这也符合 Docker 官方镜像维护者的说明。
本人当时采用的临时办法是改用较旧的 Bullseye 基础镜像,如下。这个办法适用于当时的环境,使用前仍需确认标签和发行版的支持状态:
1 | # FROM python:3.12-slim |
如果确认是 keyring 缺失或损坏,应修复对应发行版的 debian-archive-keyring,并用仓库的 Signed-By 限定有效密钥。不要把 /usr/share/keyrings/debian-archive-* 全部链接到信任目录:这个通配符还会匹配 debian-archive-removed-keys.gpg,引入旧发行版的密钥。密钥调整也不能修复宿主 seccomp 本身。