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
相关产品推荐
相关产品推荐

