В Dockerfile у меня есть слой, который устанавливает 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))
python
docker
dockerfile
Прометей
источник
источник
docker build
(и свойDockerfile
). Предположительно, это более ранний шаг в процессе сборки, который разрушает кеш, вызывая выполнение этого шага.Ответы:
Я предполагаю, что в какой-то момент процесса сборки вы копируете все свое приложение в образ Docker с помощью
COPY
илиADD
:Проблема в том, что вы аннулируете кеш сборки 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...
Поскольку сам файл требований, вероятно, изменяется редко, вы сможете использовать кэшированные слои до того момента, когда вы добавите код своего приложения в изображение.
источник
COPY
что предпочтительнее,ADD
если вам не требуется поведениеADD
.ADD
требуется только в том случае, если<src>
папка содержит архив, который необходимо распаковать или поддерживать удаленную обработку URL. {исходный код}Это прямо упоминается в собственных « лучших практиках написания файлов Docker »:
источник
В качестве альтернативы более быстрому способу запуска файла requirements.txt без ввода «да» для подтверждения установки библиотек вы можете переписать его как:
COPY requirements.txt ./ RUN pip install -y -r requirements.txt COPY ./"dir"/* .
источник