参照Docker官方Python教程构建镜像失败,pip无法匹配对应依赖版本
问题根因
- 你直接在Ubuntu系统全局Python环境执行
pip freeze导出的requirements.txt包含了大量Ubuntu系统预装的专属Python包,比如报错的Brlapi是系统盲文支持组件、python-apt/cupshelpers等都是系统绑定包,这类包不会上传到PyPI源,Docker使用的Debian slim环境没有对应安装源,自然会报错找不到发行版本。 - 导出的
requirements.txt格式错误,每一行前缀多了减号、部分行有多余前置空格,也会导致pip解析依赖失败。 - 你的项目实际只需要Flask相关依赖,全局导出的几十种依赖绝大多数都和你的项目无关。
解决方案
推荐使用虚拟环境隔离项目依赖
在你的项目目录下执行以下命令重新生成正确的依赖文件:# 安装虚拟环境组件 sudo apt install python3-venv # 创建虚拟环境 python3 -m venv venv # 激活虚拟环境 source venv/bin/activate # 只安装你项目需要的Flask依赖 pip install flask # 导出依赖,此时生成的文件仅包含项目实际用到的包 pip freeze > requirements.txt用新生成的
requirements.txt重新构建镜像即可。手动精简依赖(临时方案)
如果你不想用虚拟环境,直接手动清空原requirements.txt,只保留以下Flask运行必须的依赖即可:Flask==2.0.1 itsdangerous==2.0.1 Jinja2==3.0.1 MarkupSafe==2.0.1 Werkzeug==2.0.1 click==8.0.1可选:处理slim镜像缺少编译依赖的问题
如果修改依赖后仍有安装报错,可在Dockerfile的RUN pip3 install命令前增加一行安装基础编译工具的指令,优化后的Dockerfile如下:# syntax=docker/dockerfile:1 FROM python:3.8-slim-buster WORKDIR /app # 安装基础编译依赖,安装完成后清理缓存减小镜像体积 RUN apt update && apt install -y --no-install-recommends gcc python3-dev \ && apt clean \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt requirements.txt RUN pip3 install -r requirements.txt COPY . . CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]
内容的提问来源于stack exchange,提问作者Patrick Long
相关产品推荐
相关产品推荐

