22

我有一个要投入生产的 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 PillowDockerfile)中,我会在尝试构建容器时收到更长的错误消息。

无需放入pip install PillowDockerfile 或 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"]

要求.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

我已经坚持了一段时间。有人可以帮忙吗?

4

6 回答 6

56

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

安装 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 提出的解决方案:我只是想以一种非常冗长的方式来解释这一点,以帮助他人。

apk add --virtual 命令的 .build-deps 是什么?

于 2019-09-04T12:35:21.610 回答
20

将此添加到您的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

于 2019-09-04T11:31:38.770 回答
6

我刚刚将这些行添加到我的 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
于 2021-01-03T22:36:29.297 回答
0

将此添加到您的 Docker 文件中

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

于 2021-12-05T00:05:26.417 回答
0

#Docker 文件来自 python:3.7-alpine

工作目录 /app

设置环境变量

ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1

安装 psycopg2 依赖项

RUN apk update
&& apk add postgresql-dev gcc python3-dev musl-dev libc-dev make git libffi-dev openssl-dev libxml2-dev libxslt-dev zlib-dev jpeg-dev

安装依赖项

复制 requirements.txt /app/requirements.txt 运行 pip install --upgrade pip 运行 pip install -r requirements.txt

复制项目

复制 。.

需求文件

Pillow==9.0.0

于 2022-01-29T13:49:51.503 回答
0

就我而言,它对我有用

FROM python:3.9.7-alpine

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1


RUN mkdir /backend
ADD ./app /backend

WORKDIR /backend


RUN apk update && \
    apk add --virtual .tmp gcc python3-dev jpeg-dev zlib-dev musl-dev libjpeg py3-setuptools \
    tiff-dev openjpeg-dev freetype-dev lcms2-dev \
    libwebp-dev tcl-dev tk-dev harfbuzz-dev fribidi-dev libimagequant-dev \
    libxcb-dev libpng-dev alpine-sdk build-base openssl-dev dateutil tzdata py3-tz && \
    
    pip install --upgrade pip && \
    pip install -r requirements.txt && \
    echo 'requirements Installed' && \
    pip install uvicorn gunicorn  && \

    apk del .tmp



ENV DB_NAME  ******
ENV DB_USER ******
ENV DB_PASSWORD ******

ENV DJANGO_SUPERUSER_PASSWORD ******

CMD gunicorn myproject.asgi:application -k uvicorn.workers.UvicornWorker


于 2022-02-16T22:03:34.073 回答