Подтвердить что ты не робот

Докер, как запустить pip requirements.txt, только если произошли изменения?

В файле Docker у меня есть слой, который устанавливает requirements.txt:

FROM python:2.7
RUN pip install -r requirements.txt

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

Как я могу убедиться, что Docker работает только pip install -r requirements.txt, если произошел сбой в файле?

Removing intermediate container f98c845d0f05
Step 3 : RUN pip install -r requirements.txt
 ---> Running in 8ceb63abaef6
Collecting https://github.com/tomchristie/django-rest-framework/archive/master.zip (from -r requirements.txt (line 30))
  Downloading https://github.com/tomchristie/django-rest-framework/archive/master.zip
Collecting Django==1.8.7 (from -r requirements.txt (line 1))
4b9b3361

Ответ 1

Я предполагаю, что в какой-то момент вашего процесса сборки вы копируете все свое приложение в изображение Docker с помощью COPY или ADD:

COPY . /opt/app
WORKDIR /opt/app
RUN pip install -r requirements.txt

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

Чтобы предотвратить это, я предлагаю копировать только файл requirements.txt на отдельном этапе сборки перед добавлением всего приложения в изображение:

COPY requirements.txt /opt/app/requirements.txt
WORKDIR /opt/app
RUN pip install -r requirements.txt
COPY . /opt/app
# continue as before...

Поскольку файл требований, вероятно, изменяется редко, вы сможете использовать кешированные слои до тех пор, пока вы не добавите код приложения в изображение.

Ответ 2

Это прямо упоминается в Docker own " Рекомендации по написанию файлов Dockerfiles:

Если у вас несколько шагов Dockerfile, которые используют разные файлы из ваш контекст, КОПИРУЙТЕ их индивидуально, а не все сразу. Эта будет гарантировать, что каждый шаг создания кеша будет только аннулирован (принуждение шаг, который нужно повторно запустить), если файлы, требующие изменения, будут изменены.

Например:

COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/

Результаты с меньшим количеством недействительных кешей для шага RUN, чем если вы положите КОПИЯ./tmp/перед этим.