DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

Poetry 以 root 安装源码包报 getgrnam None,保留安全解压过滤

Poetry 在旧 Python 中清除源码包所有权时传入 None,会使 root 解压失败,应采用兼容值修复并保留安全过滤。

Docker 构建中,Poetry 2.4.2 以 root 安装没有 wheel 的依赖,解压 sdist 时出现 TypeError: getgrnam() argument 'name' must be str, not None,可以先核对镜像的 Python 补丁版本。真实触发环境包括 python:3.10.4-bullseye;只有源码包安装路径出错,不能据此判断依赖代码本身不支持 Python。

Poetry 在缺少 tarfile.data_filter 的旧解释器上使用安全解压的兼容实现。这条实现会清除压缩包中记录的所有权信息,但把用户组名设成了 None。旧版 TarFile.chown() 在 root 环境仍会把它交给 grp.getgrnam() 查询,最终抛出类型错误。新解释器能接受的清除方式,并不自动适用于旧接口。

Poetry 2.4.3 包含修复:所有者数字改为 -1,名称改为空字符串,表达“保留当前所有权”,同时继续执行安全过滤。更新运行 Poetry 的工具环境,而不是只改项目虚拟环境里的一个依赖版本。

poetry --version
python --version

按原安装方式将 Poetry 更新至 2.4.3。例如原来由 pipx 管理时,可以使用:

pipx upgrade poetry
poetry --version

pipx upgrade 得到的版本由工具环境与索引决定,执行后确认实际版本包含所需修复。容器镜像里原本固定安装 Poetry 的流程,则应修改那条固定版本配置,再重新构建工具层;不要另装一套 Poetry 后仍调用旧路径。

验收要保留原来会安装 sdist 的依赖及解释器条件,重新执行项目已有的 poetry install -vvv,确认不再在 getgrnam()、getpwnam() 或所有权设置处失败,并检查依赖确实进入了目标环境。若下载源现在提供了 wheel,安装成功可能只是绕开了解压路径,不能作为原故障已经修好的唯一依据。

也可更新基础镜像到有相应 tarfile 能力的兼容 Python 补丁版本,但仍应核对项目支持范围与锁文件。复验成功后,再检查包的导入或项目测试,而不是停在解压完成。

不要为这个异常移除解压过滤或直接换成未过滤的 extractall()。错误来自旧接口接受的清除值,不需要接受压缩包任意路径与所有权。其他下载、权限或编译错误,应保留新异常继续诊断;这项修复不保证所有源码包都能构建。