Dockers Python: x.x.x-alpine Image startet die Django-App und migriert mit dem Fehler "ImageField kann nicht verwendet werden, da Pillow nicht installiert ist"

Dies ist ein Problem, das beim Bereitstellen einer Django-App auf Docker in einer Produktionsumgebung aufgetreten ist. Django verwendet eine Bibliothek namens Pillow, wenn es um Bilddateien geht, aber diese Bibliothek ist umständlich und fehleranfällig. Erstellen Sie mit der folgenden Docker-Datei.

Dockerfile


###########
# BUILDER #
###########

# pull official base image
FROM python:3.7.3-alpine as builder

# set work directory
WORKDIR /usr/src/app

# set environment variables
#ENV PATH="/scripts:${PATH}"
ENV PYTHONUNBUFFERD 1
ENV PYTHONDONTWRITEBYTECODE 1

# install psycopg2 dependencies
RUN apk add --update --no-cache --virtual .tmp-build-deps postgresql-client jpeg-dev \
    .tmp-build-deps gcc build-base python3-dev musl-dev linux-headers \
    postgresql-dev
RUN apk add --update --no-cache --virtual .build-deps build-base python3-dev musl-dev \
	libc-dev linux-headers postgresql-dev musl-dev zlib zlib-dev gettext \
	postgresql-client gettext-dev libjpeg-turbo pcre
RUN apk add --update libxml2-dev libxslt-dev libffi-dev gcc libgcc openssl-dev curl
RUN apk add --update jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev libjpeg
RUN apk add --no-cache jpeg

# lint
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN pip install flake8
RUN pip install pillow
COPY . .
RUN flake8 --ignore=E501,F401 .

# install dependencies
COPY ./requirements.txt .
RUN pip wheel --no-cache-dir --no-deps --wheel-dir /usr/src/app/wheels -r requirements.txt
RUN apk del .tmp-build-deps

#########
# FINAL #
#########

# pull official base image
FROM python:3.7.3-alpine

# create directory for the app user
RUN mkdir -p /home/app

# create the app user
RUN addgroup -S app && adduser -S app -G app
COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.7/site-packages

# create the appropriate directories
ENV HOME=/home/app
ENV APP_HOME=/home/app/web
RUN mkdir $APP_HOME
#RUN mkdir $APP_HOME/staticfiles
#RUN mkdir $APP_HOME/mediafiles
WORKDIR $APP_HOME

# install dependencies
RUN apk update && apk add libpq
COPY --from=builder /usr/src/app/wheels /wheels
COPY --from=builder /usr/src/app/requirements.txt .
RUN pip install --no-cache /wheels/*
#RUN pip install pillow

# copy entrypoint-prod.sh
COPY ./entrypoint.prod.sh $APP_HOME

# copy project
COPY . $APP_HOME

# chown all the files to the app user
RUN chown -R app:app $APP_HOME

# change to the app user
USER app

#RUN chmod +x /home/app/web/entrypoint.prod.sh

# run entrypoint.prod.sh
ENTRYPOINT ["/home/app/web/entrypoint.prod.sh"]:

docker-compose.yml sollte folgendermaßen aussehen:

docker-compose.yml


version: '3.7'

services:
  web:
    build:
      context: ./app
      dockerfile: Dockerfile
    command: gunicorn backend.wsgi:application --bind 0.0.0.0:8000
    ports:
      - 8000:8000
    env_file:
      - ./.env.dev
    depends_on:
      - db
  db:
    image: postgres:12.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=hello_django
      - POSTGRES_PASSWORD=hello_django
      - POSTGRES_DB=hello_django_dev
      - POSTGRES_HOST_AUTH_METHOD=trust
  nginx:
    build: ./nginx
    ports:
      - 1337:80
    depends_on:
      - web

volumes:
  postgres_data:


Schreiben Sie so, docker-compose up -d build, docker-compose exec web python manage.py migrieren und Ich erhalte den Fehler "ImageField kann nicht verwendet werden, da das Kissen nicht installiert ist" wie den Titel des Artikels. スクリーンショット 2020-10-27 14.49.19.png

Folgen Sie der Fehleranweisung und versuchen Sie, Docker-Compose Exec Web Python-M Pip Install Pillow. スクリーンショット 2020-10-27 14.52.00.png

Wenn Sie sich die Bibliothek mit der Pip-Liste docker-compose exec web python -m ansehen, wird Pillow erfolgreich installiert. Warum......

Wenn ich es überprüfe, scheint dieser Fehler häufig aufzutreten, z. B. pip install -m Pillow, verschiedene Abhängigkeiten wie jpeg-dev mit apk in alpine zu setzen und die Version von Python und Pillow zu ändern. Ich habe verschiedene Dinge ausprobiert, aber anscheinend kann das alpine Bild nicht mit Kissen umgehen.

Ich habe das Docker-Image von python-x.x.x-alpine in python-x.x-buster geändert und es mit verschiedenen Abhängigkeiten erstellt, und ich konnte erfolgreich migrieren. Die Lösung ist einfach. Kissen kann nicht mit Django auf Docker (alpin) verwendet werden. das ist alles.

Recommended Posts

Dockers Python: x.x.x-alpine Image startet die Django-App und migriert mit dem Fehler "ImageField kann nicht verwendet werden, da Pillow nicht installiert ist"
Verwenden Sie PIL oder Pillow mit Cygwin Python
Verwenden Sie die Verschlüsselung der Verschlüsselungsbibliothek mit dem Python-Image von Docker
Verwenden Sie Python mit Docker