Докер, как запустить 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))
Ответы
Ответ 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/перед этим.