为何pip未安装requirements.txt指定的protobuf版本?
问题:如何让pip安装requirements.txt中指定版本的protobuf?
我在构建DataFlow Flex模板镜像时遇到版本冲突:requirements.txt中明确指定protobuf==3.20.3,但镜像构建完成后执行pip freeze却显示protobuf==4.21.8。
相关文件内容
requirements.txt
confluent-kafka==1.9.2 google-cloud-bigquery==3.4.0 protobuf==3.20.3 setuptools
Dockerfile
ARG TAG=latest FROM gcr.io/dataflow-templates-base/python39-template-launcher-base:${TAG} ARG WORKDIR=/opt/dataflow RUN mkdir -p ${WORKDIR} WORKDIR ${WORKDIR} ARG TEMPLATE_NAME=dataflow_flex_test COPY . ${WORKDIR} ENV FLEX_TEMPLATE_PYTHON_PY_FILE=${WORKDIR}/${TEMPLATE_NAME}/main.py ENV FLEX_TEMPLATE_PYTHON_SETUP_FILE=${WORKDIR}/setup.py RUN apt-get update \ && pip install --no-cache-dir --upgrade pip \ && pip install 'apache-beam[gcp]==2.40.0' \ && pip install --force-reinstall -r ${WORKDIR}/requirements.txt \ && pip freeze RUN python setup.py install ENV PIP_NO_DEPS=True
setup.py
import setuptools setuptools.setup( name='dataflow-flex-test', version='0.1.0', install_requires=[], packages=setuptools.find_packages(), include_package_data=True, description='dataflow flex test', author='XX' )
解决方案
问题根源
版本被覆盖的原因是Dockerfile的执行顺序:
- 先安装
apache-beam[gcp]==2.40.0,其依赖链会引入高版本protobuf - 执行
pip install --force-reinstall -r requirements.txt后,protobuf确实会被降级到3.20.3 - 但后续的
python setup.py install会触发setuptools重新解析环境依赖,DataFlow基础镜像或beam的隐式依赖会再次拉取高版本protobuf,覆盖之前的指定版本
修复方案
方案1:调整安装顺序
将python setup.py install移到requirements.txt安装之前,让最后执行的依赖安装锁定版本:
RUN apt-get update \ && pip install --no-cache-dir --upgrade pip \ && pip install 'apache-beam[gcp]==2.40.0' \ && python setup.py install \ && pip install --force-reinstall -r ${WORKDIR}/requirements.txt \ && pip freeze
方案2:在setup.py中显式锁定protobuf版本
即使install_requires为空,也可以添加指定版本的依赖,确保安装过程中不会被替换:
import setuptools setuptools.setup( name='dataflow-flex-test', version='0.1.0', install_requires=[ 'protobuf==3.20.3' ], packages=setuptools.find_packages(), include_package_data=True, description='dataflow flex test', author='XX' )
方案3:用pip安装本地包替代setup.py install
python setup.py install是旧版安装方式,改用pip安装并禁用自动依赖安装,避免隐式升级:
将Dockerfile中的RUN python setup.py install替换为:
RUN pip install --no-deps .
内容的提问来源于stack exchange,提问作者CClarke
相关产品推荐
相关产品推荐

