Я могу создать рабочий образ для своего приложения на 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
идей?