LoginSignup
1
0

More than 3 years have passed since last update.

Dockerのpython:x.x.x-alpine imageでdjangoアプリを立ち上げmigrateしたときに"Cannot use ImageField because Pillow is not installed"エラーが出る問題

Posted at

DjangoアプリをDockerに乗せて本番環境にデプロイするときに生じた問題です。
DjangoではImageファイルを扱う際にPillowというライブラリを使うのですが、このライブラリが厄介で、エラーを起こしやすいです。
次のDockerfileを使ってbuildします。

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は次のようにします。

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:


このように書いてdocker-compose up -d buildして、
docker-compose exec web python manage.py migrateすると、
記事タイトルのように"Cannot use ImageField because Pillow is not installed"エラーが起こります。
スクリーンショット 2020-10-27 14.49.19.png

エラー文に従ってdocker-compose exec web python -m pip install Pillowしてみます。
スクリーンショット 2020-10-27 14.52.00.png

というか、docker-compose exec web python -m pip listでライブラリを見ると、Pillowは無事インストールされています。
なぜだ......

調べるとこのエラーはよく起こるようで、pip install -m Pillowをしろだとか、alpineにapkで色々jpeg-devとかのdependenciesを入れろだとか、pythonとpillowのversionを変えろとか出てきます。色々試してみましたが、どうやら、alpineイメージではPillowを扱うことができないようです。

Dockerイメージをpython-x.x.x-alpineからpython-x.x-busterに変更して色々dependenciesを入れてbuildしたところ、無事migrateできました。解決法としてはシンプルです。django on docker(alpine)でPillowは使えません。以上です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0