'Django, Docker, Python - Unable to install Pillow on python-alpine

I have a dockerized django app that I want to put in production. But ever since I added an Imagefield Pillow is required and I struggle to install Pillow in the Docker container.

As far as I understand it, adding the dependencies jpeg-dev ibjpeg & zlib-dev should be enough for django (?). With the configuration below I receive the error:

Error on 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".

If I add Pillow to requirements.txt (or putting pip install Pillow in the Dockerfile) I get an even longer error message while trying to build the container.

Without putting pip install Pillow in Dockerfile or requirements.txt - this is my configuration.

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

I have been stuck with this for a while. Can someone help?



Solution 1:[1]

add this to your 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

source: Github

Solution 2:[2]

I just added these lines to my Dockerfile and it worked

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

My Dockerfile (using 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

Solution 3:[3]

Add this to your Docker file

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

Solution 4:[4]

#Docker file FROM python:3.7-alpine

WORKDIR /app

set environment variables

ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1

install psycopg2 dependencies

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

install dependencies

COPY requirements.txt /app/requirements.txt RUN pip install --upgrade pip RUN pip install -r requirements.txt

copy project

COPY . .

Requirement file

Pillow==9.0.0

Solution 5:[5]

In my case it worked for me

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


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 LinPy
Solution 2 gastrodon
Solution 3 José Jaraba
Solution 4 Krishna Jhapate
Solution 5 Nima