Il s'agit d'un problème survenu lors du déploiement d'une application Django sur Docker dans un environnement de production. Django utilise une bibliothèque appelée Pillow lorsqu'il traite des fichiers image, mais cette bibliothèque est gênante et sujette aux erreurs. Construisez à l'aide du Dockerfile suivant.
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 devrait ressembler à ceci:
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:
Écrivez comme ceci, docker-compose up -d build, docker-compose exec web python manage.py migrer et J'obtiens une erreur "Impossible d'utiliser ImageField car Pillow n'est pas installé" comme le titre de l'article.
Suivez l'instruction d'erreur et essayez docker-compose exec web python -m pip install Pillow.
Ou plutôt, si vous regardez la bibliothèque avec docker-compose exec web python -m pip list, Pillow est installé avec succès. Pourquoi......
Lorsque je le vérifie, cette erreur semble se produire fréquemment, comme pip install -m Pillow, mettre diverses dépendances telles que jpeg-dev avec apk en alpin et changer la version de python et de l'oreiller. J'ai essayé diverses choses, mais apparemment l'image alpine ne peut pas gérer Pillow.
J'ai changé l'image Docker de python-x.x.x-alpine en python-x.x-buster et l'ai construite avec diverses dépendances, et j'ai pu migrer avec succès. La solution est simple. Pillow ne peut pas être utilisé avec django sur docker (alpin). c'est tout.
Recommended Posts