You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker脚本安装Python 3.9近期执行失败技术问询

问题解决:pipenv安装Python3.9时出现TypeError: canonicalize_version()参数错误

问题描述

AWS EC2实例上使用一年未修改的Dockerfile构建镜像,执行RUN pipenv install --python 3.9时突然失败,报错:

TypeError: canonicalize_version() got an unexpected keyword argument 'strip_trailing_zero'

两天前该构建流程还能正常运行。

错误原因

从报错栈可以看出,setuptools新版本(70.2.0及以上)引入了strip_trailing_zero参数传递给canonicalize_version函数,但当前环境中依赖的packaging库版本不支持该参数。由于Dockerfile中未固定pipenv、setuptools或packaging的版本,当上游setuptools包更新后,就触发了这个兼容性冲突。

解决方案

方案1:固定setuptools兼容版本

在安装pipenv后,先指定安装兼容的setuptools版本(比如之前成功日志中的70.1.0):

RUN curl https://raw.githubusercontent.com/pypa/pipenv/master/get-pipenv.py | python3.9
# 添加这行固定setuptools版本
RUN pip3.9 install setuptools==70.1.0
RUN pipenv install --python 3.9

方案2:固定pipenv稳定版本

避免安装master分支的最新版pipenv,改用已知稳定的版本:

# 指定pipenv的稳定版本,比如v2023.10.3
RUN curl https://raw.githubusercontent.com/pypa/pipenv/v2023.10.3/get-pipenv.py | python3.9
RUN pipenv install --python 3.9

方案3:在Pipfile中锁定依赖版本

如果项目使用Pipfile,直接添加packaging和setuptools的版本限制:

[packages]
# 保留原有依赖,新增以下两行
packaging = ">=23.2,<24"
setuptools = ">=70.1.0,<70.2.0"

重新生成Pipfile.lock后,Docker构建时会自动使用指定版本的依赖。

关键说明

Docker构建流程中,若未明确指定依赖版本,默认会拉取最新包。这类"突然失败"的问题大多是上游包的兼容性变更导致,固定核心依赖的版本是避免此类问题的最佳实践。

内容的提问来源于stack exchange,提问作者David McClure

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 20:57:03