为何用pip freeze生成的requirements在Docker重建时出现依赖冲突?
问题原因分析
pip freeze仅导出Python环境中的Python包及其版本,完全不会记录系统层面的依赖(比如cairo这类系统库)。- 你第一次创建容器时,自定义基础镜像里已经预装了cairo系统库,所以安装
pycairo和PyGObject时,pip能顺利完成编译/安装流程。但导出的requirements.txt里只会留下pycairo==x.x.x、PyGObject==y.y.y这类记录,不会提及需要先装系统级的cairo依赖。 - 重建镜像时,如果你的Dockerfile没有明确添加安装cairo系统库的步骤(比如
apt-get install -y libcairo2-dev这类命令),当pip尝试安装pycairo时,会因为找不到底层的cairo系统依赖而编译失败,抛出你看到的错误。 - 额外补充:如果你的私有pip仓库里提供的是预编译好的
pycairowheel包(该wheel是在已安装cairo的环境下编译生成的),第一次安装时可以直接用wheel跳过编译;但重建时如果因为网络或仓库配置问题拉不到这个预编译wheel,pip就会 fallback 到源码编译,这时候就必须要有系统级的cairo依赖才能成功。
内容的提问来源于stack exchange,提问作者Carlo
相关产品推荐
相关产品推荐

