#python #dockerfile #docker-multi-stage-build
Вопрос:
Я хотел бы создавать пакеты в slim
образе, а затем копировать созданные пакеты в alpine
один. Для этого я создал файл Dockerfile:
FROM python:3.8.7-slim AS builder
ENV POETRY_VIRTUALENVS_CREATE=false
WORKDIR /app
RUN apt-get update
RUN apt-get install -y build-essential
RUN apt-get install -y libldap2-dev # for python-ldap
RUN apt-get install -y libsasl2-dev # for python-ldap
COPY poetry.lock pyproject.toml ./
RUN python -m pip install --upgrade pip amp;amp; pip install poetry amp;amp; poetry install --no-dev
FROM python:3.8.7-alpine3.13 AS runtime
COPY --from=builder /root/* /root/
WORKDIR /app
COPY pythonapline .
#RUN python manage.py makemigrations amp;amp; python manage.py migrate
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
По умолчанию poetry
создает виртуальную среду в каталоге ~/.cache/pypoetry/virtualenvs (Linux)
.
При запуске образа среды выполнения я получаю ошибки импорта. Кажется, что скопированный виртуальный env должен быть активирован или что-то в этом роде?
Ответ №1:
Проблема в том, что вы неправильно копируете пакеты установки на runtime
сцену. Обратите внимание, что ENV POETRY_VIRTUALENVS_CREATE=false
это заставляет поэзию устанавливать зависимости без использования виртуальной среды.
Попытайтесь изменить это
COPY --from=builder /root/* /root/
Для
COPY --from=builder /usr/local/lib/python3.8/site-packages /usr/local/lib/python3.8/site-packages
Также обратите внимание, что вы можете лучше использовать кэш, разделив установку самой поэзии перед запуском poetry install --no-dev
, чтобы вам не пришлось переустановить поэзию после обновления зависимостей.
RUN python -m pip install --upgrade pip amp;amp; pip install poetry
COPY poetry.lock pyproject.toml ./
poetry install --no-dev
Однако нет никакой гарантии, что двоичные файлы, работающие на slim, также будут совместимы с alpine, использующим musl libc. Использование приложения alpine linux для Python не рекомендуется.