Docker删除临时构建依赖后Pillow未安装报错如何解决?
问题根因
Pillow编译时需要zlib-dev、jpeg-dev这类带dev后缀的头文件包,但运行时也需要对应的基础动态库包zlib、jpeg。你当前的配置把所有编译相关的依赖都放到了.tmp-deps临时组中,执行apk del .tmp-deps时会把Pillow运行必须的动态库也一并删除,导致Python导入PIL模块失败,Django因此抛出Pillow未安装的错误。
解决方案
调整Dockerfile的依赖安装逻辑,把运行时必须的永久依赖和编译用的临时依赖拆分,仅删除编译阶段的临时依赖即可,同时还能保证镜像体积最小化:
- 将
zlib、jpeg这两个Pillow运行必需的依赖,和postgresql-client一起作为永久依赖安装,不加入临时依赖组 - 临时依赖组仅保留编译时需要的
zlib-dev、jpeg-dev等带dev后缀的头文件包,安装完pip依赖后直接删除即可
修改后的Dockerfile对应段如下:
RUN python -m venv /py && \ /py/bin/pip install --upgrade pip && \ # 安装永久运行时依赖,不会被删除 apk add --update --no-cache postgresql-client zlib jpeg && \ # 安装仅编译阶段需要的临时依赖 apk add --update --no-cache --virtual .tmp-deps \ build-base postgresql-dev musl-dev linux-headers \ python3-dev zlib-dev jpeg-dev gcc && \ /py/bin/pip install -r /requirements.txt && \ # 仅删除临时构建依赖,保留运行时依赖 apk del .tmp-deps
验证方法
镜像构建完成后,可进入容器执行以下命令验证Pillow是否正常可用:/py/bin/python -c "from PIL import Image; print('Pillow加载成功')"
如果无报错输出即为配置生效。
内容的提问来源于stack exchange,提问作者Sariyanta Made
相关产品推荐
相关产品推荐

