使用Python:3.8 Docker镜像构建失败:apt-get更新遇GPG签名错误
Python 3.8 Docker镜像构建apt-get更新失败问题排查与解决
问题场景
构建流水线此前运行正常,近期突然失效。使用python:3.8作为基础镜像编写Dockerfile构建应用,未修改Dockerfile,但执行apt-get update && apt-get install步骤时失败。
Dockerfile片段
FROM python:3.8 ... RUN apt-get update && \ apt-get install -y default-libmysqlclient-dev libffi-dev libssl-dev git jq tree ...
报错信息
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 E: The repository 'http://deb.debian.org/debian bookworm InRelease' is not signed.
原因分析
python:3.8官方镜像底层基于Debian Bookworm系统,近期Debian官方更新了软件源的GPG签名密钥,但旧版本的python:3.8镜像未包含这些新密钥,导致apt-get update时无法验证源的合法性,从而抛出签名错误。
解决方法
方法一:手动添加缺失的GPG密钥
在执行apt-get update前,先通过密钥服务器获取并添加缺失的密钥,有两种实现方式:
方式1(兼容旧版apt-key,不推荐长期使用)
FROM python:3.8 RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9 6ED0E7B82643E131 F8D2585B8783D481 && \ apt-get update && \ apt-get install -y default-libmysqlclient-dev libffi-dev libssl-dev git jq tree
方式2(符合Debian新规范,推荐)
FROM python:3.8 RUN mkdir -p /usr/share/keyrings && \ gpg --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9 6ED0E7B82643E131 F8D2585B8783D481 && \ gpg --export 0E98404D386FA1D9 6ED0E7B82643E131 F8D2585B8783D481 > /usr/share/keyrings/debian-archive-keyring.gpg && \ apt-get update && \ apt-get install -y default-libmysqlclient-dev libffi-dev libssl-dev git jq tree
方法二:使用带具体系统版本的Python镜像
避免使用滚动更新的python:3.8标签,改用绑定Debian版本的镜像标签,这类镜像已预装更新后的GPG密钥:
FROM python:3.8-bookworm ... RUN apt-get update && \ apt-get install -y default-libmysqlclient-dev libffi-dev libssl-dev git jq tree ...
方法三:升级Python版本(若业务允许)
如果业务兼容,将Python版本升级到3.9及以上的稳定版,这些版本的官方镜像基于更新的Debian系统,已修复密钥问题,同时能获得更好的安全性和兼容性。
内容的提问来源于stack exchange,提问作者Abdullah Khawer
相关产品推荐
相关产品推荐

