Alpine基础镜像构建Docker镜像时安装Matplotlib卡住如何解决
问题根因
- 基础镜像选型不当:你使用的Alpine发行版默认采用musl libc作为系统C运行库,而numpy、matplotlib等Python科学计算包官方提供的预编译wheel包仅适配glibc生态。pip安装时无法找到适配musl的预构建包,会触发源码编译流程,整个过程需要下载大量编译依赖、执行长时间编译操作,就会表现为卡住无响应。
- 依赖配置错误:
requirements.txt中sklearn==0.0是无效配置,sklearn包早已废弃,当前正确的机器学习包名为scikit-learn,你所写的0.0版本仅为占位空包,无法提供实际功能。 - Dockerfile冗余配置(非卡住原因,属于额外错误):Dockerfile中仅最后一个
CMD指令会生效,你写的两个CMD会导致前一个启动app.py的指令被直接忽略,容器启动后只会运行web.py。
修复方案
首选方案(推荐)
更换为debian系Python官方镜像,直接使用预编译的wheel包,安装速度快、稳定性高:
- 修正
requirements.txt,替换无效的sklearn依赖:
flask matplotlib==3.3.4 numpy==1.20.1 scikit-learn==0.24.1
- 修正Dockerfile内容:
# 选用glibc生态的Python slim镜像,体积小且适配科学计算包 FROM python:3.8-slim WORKDIR /usr/src/app # 安装matplotlib运行所需的系统依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ libfreetype6-dev \ libpng-dev \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . # 如需同时运行两个Python进程,可编写启动脚本后在此处调用,示例: # CMD ["bash", "./start.sh"] CMD ["python3", "./web.py"]
备选方案(坚持使用Alpine的情况)
需提前安装全部编译依赖,编译耗时较长,镜像体积更大:
在Dockerfile的pip install步骤前添加编译依赖安装指令:
RUN apk add --no-cache gcc gfortran musl-dev freetype-dev libpng-dev openblas-dev
内容的提问来源于stack exchange,提问作者Uvular
相关产品推荐
相关产品推荐

