【问题标题】:Django, Docker, Python - Unable to install Pillow on python-alpineDjango、Docker、Python - 无法在 python-alpine 上安装 Pillow
【发布时间】:2020-01-07 06:57:50
【问题描述】:

我有一个要投入生产的 dockerized django 应用程序。但是自从我添加了 Imagefield Pillow 之后,我就很难在 Docker 容器中安装 Pillow。

据我了解,添加依赖项 jpeg-dev ibjpeg 和 zlib-dev 对于 django(?)应该足够了。使用下面的配置我收到错误:

runserver 出错:

product.Product.image: (fields.E210) Cannot use ImageField because Pillow is not installed.
    HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "pip install Pillow".
product.Product.thumbnail: (fields.E210) Cannot use ImageField because Pillow is not installed.
    HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "pip install Pillow".

如果我将 Pillow 添加到 requirements.txt(或将 pip install Pillow 放入 Dockerfile),我会在尝试构建容器时收到更长的错误消息。

没有将pip install Pillow 放入 Dockerfile 或 requirements.txt - 这是我的配置。

Dockerfile:

# pull official base image
FROM python:3.7-alpine

# set environment varibles
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# set work directory
WORKDIR /usr/src/kitschoen-dj

RUN pip install --upgrade pip

# install psycopg2
RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev \
    && apk add postgresql \
    && apk add postgresql-dev \
    && pip install psycopg2 \
    && apk del build-deps
    && apk add jpeg-dev \
    && apk add libjpeg \
    && apk add zlib-dev

# install dependencies
RUN pip install --upgrade pip
COPY ./requirements.txt /usr/src/kitschoen-dj/requirements.txt
RUN pip install -r requirements.txt

# copy entrypoint.sh
COPY ./entrypoint.sh /usr/src/kitschoen-dj/entrypoint.sh

# copy project
COPY . /usr/src/kitschoen-dj/

# run entrypoint.sh
ENTRYPOINT ["/usr/src/kitschoen-dj/entrypoint.sh"]

Requirements.txt

astroid==2.1.0
certifi==2018.11.29
chardet==3.0.4
Django==2.1.7
django-cors-headers==2.4.0
django-filter==2.1.0
djangorestframework==3.9.1
djangorestframework-simplejwt==3.3
gunicorn==19.9.0
httpie==1.0.2
httpie-jwt-auth==0.3.0
idna==2.8
isort==4.3.4
lazy-object-proxy==1.3.1
Markdown==3.0.1
mccabe==0.6.1
PyJWT==1.7.1
requests==2.21.0
six==1.12.0
urllib3==1.24.1
wrapt==1.11.1

我已经被这个问题困扰了一段时间。有人可以帮忙吗?

【问题讨论】:

    标签: python django docker python-imaging-library


    【解决方案1】:

    对于任何对对我有用的东西感兴趣的人(+关于我遇到这个问题的一些背景):

    安装 Pillow 需要几个依赖项。据我所知,您需要:gcc python3-dev jpeg-dev zlib-dev

    为了防止这些依赖项最终出现在最终映像中(保持映像大小较小),您可以将其中的一些(不是全部!)安装在虚拟包中。

    成功安装 Pillow 后,您可以删除仅安装 Pillow 所需的依赖项。仅在构建期间需要的依赖项称为build dependencies

    所以这是对我有用的代码:

    RUN apk update \
        && apk add --virtual build-deps gcc python3-dev musl-dev \
        && apk add postgresql \
        && apk add postgresql-dev \
        && pip install psycopg2 \
        && apk add jpeg-dev zlib-dev libjpeg \
        && pip install Pillow \
        && apk del build-deps
    

    (Pillow 不需要某些东西,例如 postgressql、postgresql-dev)。如您所见,我将构建依赖项安装在一个名为build-deps 的虚拟包中。之后,我正在安装 Pillow。最后,我将删除构建依赖项。

    我认为这也是@LinPy 提出的解决方案:我只是想解释这个非常冗长以最终帮助他人。

    What is .build-deps for apk add --virtual command?

    【讨论】:

    • 为什么这里有postgresql?枕头需要吗?
    • “据我所知,你需要...”请阅读原文。
    • 另外,我在帖子中确实写道:“(Pillow 不需要某些东西,例如 postgressql、postgresql-dev)”
    【解决方案2】:

    将此添加到您的Dockerfile

    RUN apk add --no-cache jpeg-dev zlib-dev
    RUN apk add --no-cache --virtual .build-deps build-base linux-headers \
        && pip install Pillow
    

    来源:Github

    【讨论】:

    • 感谢您的意见使我朝着正确的方向前进!并不是说您的解决方案不起作用......但它会增加大约 120MB 的图像大小,这是相当多的。
    • 没错,我认为您的解决方案是正确的。我缺少的是(因为我还在学习很多东西,我必须在后面的步骤中删除 .build-deps 以使它们不会出现在图像中。但我喜欢使用 meta- package build-base。我会记住这一点。
    • Pillow 需要 zlib-dev 和 jpeg-dev 作为可以删除的构建依赖项。但它在运行时也需要 libjpeg。所以你可以使用这样的东西来制作一个最小的图像:RUN apk add --update --no-cache --virtual .tmp gcc libc-dev linux-headers zlib-dev jpeg-dev && apk add libjpeg && pip install Pillow --no-cache-dir && apk del .tmp
    【解决方案3】:

    我刚刚将这些行添加到我的 Dockerfile 中,它工作了

    RUN apk add --update --no-cache --virtual .tmp gcc libc-dev linux-headers
    RUN apk add --no-cache jpeg-dev zlib-dev
    RUN apk del .tmp
    

    我的 Dockerfile(使用 python:3.8-alpine):

    COPY ./requirements.txt /requirements.txt
    RUN apk add --update --no-cache --virtual .tmp gcc libc-dev linux-headers
    RUN apk add --no-cache jpeg-dev zlib-dev
    RUN pip install -r /requirements.txt
    RUN apk del .tmp
    

    【讨论】:

      【解决方案4】:

      将此添加到您的 Docker 文件中

      RUN apk add postgresql-dev gcc python3-dev musl-dev jpeg-dev zlib-dev

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-13
        • 2022-06-30
        • 2020-10-17
        • 1970-01-01
        • 2017-05-25
        • 2019-02-23
        相关资源
        最近更新 更多