Docker构建requirements.txt出现本地venv不存在的版本冲突如何解决
问题根因
- 该问题和Docker版本无关,核心是pip版本差异导致的现象不一致:
- 你本地venv使用的是20.3版本之前的pip,该版本没有严格的依赖冲突校验逻辑,哪怕依赖包之间版本不兼容,只要用户指定了固定版本就会强制安装,不会报错
- 你的Dockerfile中执行了
/var/app/bin/pip install --upgrade pip,将容器内的pip升级到了Python3.6支持的最高版本(21.3.1),该版本自带严格的依赖冲突检查,会主动拦截存在版本冲突的安装操作,所以才会出现本地正常、镜像构建失败的情况
- 你现有的requirements.txt本身确实存在依赖版本冲突,只是本地旧版pip不会暴露该问题
解决方案(无需修改任何依赖版本、无需调整业务代码)
你只需要修改Dockerfile中的pip升级逻辑,将容器内的pip版本固定为和本地venv一致的旧版本即可,操作步骤如下:
- 先在本地激活你的venv环境,执行
pip --version查看本地使用的pip具体版本号,例如返回结果为pip 9.0.3 from /xxx/venv/lib/python3.6/site-packages (python 3.6),则版本号为9.0.3 - 修改Dockerfile中对应的pip升级行:
原Dockerfile中的代码:
替换为(将版本号替换为你本地查到的实际版本):RUN /var/app/bin/pip install --upgrade pipRUN /var/app/bin/pip install pip==9.0.3 - 重新执行镜像构建即可,不会再出现依赖冲突报错,安装的依赖版本和本地环境完全一致,不会导致业务异常
可选优化(非必须,不影响功能)
官方python:3.6基础镜像已经自带venv虚拟环境模块,不需要额外安装virtualenv包,你可以删除以下两行冗余代码,进一步提升构建速度:
RUN pip3 install virtualenv RUN virtualenv /var/app
替换为使用系统自带的venv创建虚拟环境:
RUN python3 -m venv /var/app
内容的提问来源于stack exchange,提问作者Ozymandias
相关产品推荐
相关产品推荐

