Скопируйте виртуальный env из slim-изображения в alpine-изображение и запустите

#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 не рекомендуется.