Многоэтапная сборка докеров для Django
Я докеризирую свое приложение Django с помощью многоэтапной сборки docker. Теперь я столкнулся с проблемой с зависимостями
Dockerfile
FROM python:3.8-slim-buster AS base
WORKDIR /app
RUN python -m venv venv
ENV PATH="/app/venv:$PATH"
COPY requirements.txt .
RUN pip install -r requirements.txt \
&& pip install gunicorn
COPY entrypoint.sh .
COPY . .
FROM python:3.8-slim-buster
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
COPY --from=base /app /app/
ENV PATH="/app/venv:$PATH"
ENTRYPOINT sh entrypoint.sh
При запуске контейнера возникает ошибка импорта.
ImportError: Не удалось импортировать Django. Вы уверены, что он установлен и доступен в вашей переменной окружения PYTHONPATH? Вы забыли активировать виртуальное окружение?
Я столкнулся с такой же ситуацией несколько месяцев назад, и это был конфликт между двумя пакетами, поэтому django не был установлен во время установки pip.
Вы можете добавить в команду сборки docker опцию '--progress=plain' и посмотреть, все ли в порядке, во время сборки docker :
- $ docker build --no-cache --progress=plain -t my_service_name . Baptiste.
вот рабочая многоступенчатая сборка docker для django.
ENV PYTHONBUFFERED 1
WORKDIR /opt/webapp/
ENV VIRTUAL_ENV=/opt/venv
RUN python3 -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
# copy requirements.txt
COPY ./requirements.txt /opt/webapp/requirements.txt
RUN pip3 install -r requirements.txt --no-cache-dir
# runner stage
FROM python:3.8-slim-buster AS runner
ARG SECRET_KEY
ARG DEBUG
WORKDIR /opt/webapp
RUN groupadd -r django \
&& useradd -d /opt/webapp -r -g django django \
&& chown django:django -R /opt/webapp
USER django
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
COPY --chown=django:django . /opt/webapp/
# run the server
CMD gunicorn conf.wsgi:application --bind 0.0.0.0:8000