Многоступенчатый Dockerfile не работает для python - PullRequest
0 голосов
/ 14 января 2020

В настоящее время я создаю виртуальную среду на первом этапе. Запуск команды pip install -r requirements.txt, которая устанавливает исполняемые файлы в /venv/bin dir.

. На втором этапе я копирую /venv/bin dir, но при запуске приложения python появляется ошибка, поскольку модуль не найден, т.е. мне нужно запустить pip install -r requirements.txt снова, чтобы запустить приложение. Приложение работает в python 2.7, и для построения некоторых зависимостей требуется компилятор. Также эти зависимости не работают с компилятором альпийских изображений и работают только с компилятором ubuntu или python: 2.7 официальным образом (который, в свою очередь, использует debian)

Я пропускаю некоторые команды на втором этапе, которые помогут в использование скопированных зависимостей вместо повторной установки.

FROM python:2.7-slim AS build
RUN apt-get update &&apt-get install -y --no-install-recommends build-essential gcc
RUN pip install --upgrade pip
RUN python3 -m venv /venv
COPY ./requirements.txt /project/requirements/
RUN /venv/bin/pip install -r /project/requirements/requirements.txt
COPY . /venv/bin

FROM python:2.7-slim AS release
COPY --from=build /venv /venv
WORKDIR /venv/bin
RUN apt-get update && apt-get install -y --no-install-recommends build-essential gcc
#RUN pip install -r requirements.txt //
RUN cp settings.py.sample settings.py
CMD ["/venv/bin/python3", "-m", "main.py"]

На втором этапе я стараюсь избегать pip install -r requirements.txt, чтобы уменьшить размер изображения, чего не происходит в настоящее время.

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Недостаточно только копировать каталог bin; например, пакеты устанавливаются в lib/pythonX.X/site-packages, а заголовки - в include. Я бы просто скопировал весь каталог venv. Вы также можете запустить его с помощью --no-cache-dir, чтобы не сохранять архивы колес.

0 голосов
/ 14 января 2020

вставить перед всеми

FROM yourimage:tag AS build
...