Как разбить установку pip на шаги в Dockerfile? - PullRequest
0 голосов
/ 30 мая 2018

В моем Dockerfile у меня есть:

FROM python:3.6-alpine

RUN apk add --no-cache --virtual .fetch-deps \
    zlib-dev \
    jpeg-dev \
    geoip-dev

ENV PYTHONUNBUFFERED 1

RUN mkdir /src
WORKDIR /src
ADD requirements.txt /src/

RUN pip install -r requirements.txt

Если при загрузке или установке зависимостей в requirements.txt возникают проблемы при повторном запуске сборки, pip install загружает все заново.

Каковы лучшие практики для Dockerfile в этом случае?Нужно ли разделять требования?Использовать отдельные тома?Или есть инструкция, отличная от RUN, которая предназначена только для таких случаев?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Каждая инструкция, которую вы добавляете в Dockerfile при сборке, добавляет новый слой в сборку.Для каждой команды, выполняемой при сборке, слой изображения кэширует содержимое этого слоя поверх других.Слои можно кэшировать между сборками, если ожидается, что результаты будут одинаковыми каждый раз.

В вашем случае, если этап, на котором создается файл требований, не пройден, этот этап не будет считаться завершенным, то есть следующийкогда вы запустите сборку, она начнет этот шаг заново (что запустит установку для всего в requirements.txt).

Одна вещь, которую вы можете сделать, чтобы сократить пересборки, - это ввести многоступенчатую сборку, гдепервый этап устанавливает требования, а второй этап запускает ваше приложение;таким образом, первый этап требований выполняется только при изменении requirements.txt.

# FROM x as y
# will name this stage of the build as "dependencies"
FROM python:3.6-alpine as dependencies

RUN apk add --no-cache --virtual .fetch-deps \
    zlib-dev \
    jpeg-dev \
    geoip-dev

ENV PYTHONUNBUFFERED 1

RUN mkdir /src
WORKDIR /src
ADD requirements.txt /src/

RUN pip install -r requirements.txt

# This is the next stage of the build building off your dependencies
FROM dependencies as application

RUN my_application.py
0 голосов
/ 30 мая 2018

Похоже, что вы находитесь в процессе устранения неполадок сборки Dockerfile.Слой не будет применен к изображению, если он выдает ошибку при построении, поэтому ему придется заново его перестроить с самого начала - именно так работает Docker.

Если вы хотите сократитьЦикл обратной связи при устранении неполадок в вашей сборке вы можете разделить установки pip на несколько файлов или даже выполнить exec в контейнере и вручную установить требования для установки pip, но как только у вас все получится, я бы собрал все установки pip в одну команду, чтобы сохранитьDockerfile оптимизирован.

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