Как сделать облегченный образ докера для приложения Python с помощью pipenv - PullRequest
2 голосов
/ 09 октября 2019

Я могу создать рабочий образ для своего приложения на python, выполнив следующие простые Dockerfile:

FROM python:3.7
WORKDIR /myapp
COPY Pipfile* ./
RUN pip install pipenv
RUN pipenv install --system --deploy
COPY src .
CMD ["python3", "app.py"]

Однако он создаст образ размером ~ 1 ГБ, который может содержать временные файлы, и сложен для развертывания. И мне нужен только полный образ питона для строительных целей. Мое приложение может успешно работать на альпийском варианте, поэтому я могу сделать двухпроходный Dockerfile:

FROM python:3.7 as builder
COPY Pipfile* ./
RUN pipenv lock --requirements > requirements.txt
RUN python3 -m venv /venv
RUN /venv/bin/pip install --upgrade pip
RUN /venv/bin/pip install -r requirements.txt

FROM python:3.7-alpine
COPY --from=builder /venv /venv
WORKDIR /myapp
COPY src .
CMD ["/venv/bin/python3", "app.py"]

Пока все хорошо, оно также работает, будучи в 6 раз меньше. Но эта схема рассматривалась как некоторая «заглушка», имеющая некоторые недостатки:

  • Она имеет ненужные дополнительные COPY --from=builder step
  • Она не использует pipenv, но требует также pip для установки (+1 дополнительный шаг, pipenv lock + pip install всегда медленнее, чем просто pipenv install)
  • Он устанавливается не по всей системе, а в /venv, чего следует избегатьвнутри контейнера
  • Minor: Build больше загрязняет кэш промежуточных изображений и требует загрузки обоих вариантов изображений ..

Как объединить эти два подхода, чтобы получить lightweitht alpineизображение с pipenv, без упомянутых недостатков?

Или вы можете предложить свою продукцию Dockerfile идей?

1 Ответ

3 голосов
/ 09 октября 2019

Как насчет

FROM python:3.7-alpine

WORKDIR /myapp

COPY Pipfile* ./

RUN pip install --no-cache-dir pipenv && \
    pipenv install --system --deploy --clear

COPY src .
CMD ["python3", "app.py"]
  1. Используется меньшая версия Alpine.
  2. У вас не останется ненужных файлов кэша, если использовать опцию --no-cache-dir для pip и --clear опция для pipenv.
  3. Вы также можете развернуть за пределами venv.

Вы также можете добавить && pip uninstall pipenv -y после pipenv install --system --deploy --clear в том же RUNкоманда, чтобы исключить пространство, занятое pipenv, если этот дополнительный размер изображения беспокоит вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...