Docker, як запустити pip requirements.txt, лише якщо відбулися зміни?


91

У 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))

1
Будь ласка, опублікуйте результат docker build(та ваш Dockerfile). Імовірно, це більш ранній крок у процесі вашої збірки, який знищує кеш, що призводить до запуску цього кроку.
Thomas Orozco

оновити ОП з усім, що я маю на даний момент
Прометей

1
Просто цей крок не корисний. Будь ласка, опублікуйте повний висновок (або принаймні файл Docker).
Thomas Orozco

Відповіді:


171

Я припускаю, що в якийсь момент процесу збірки ви копіюєте всю свою програму в образ 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...

Оскільки сам файл вимог, ймовірно, змінюється лише рідко, ви зможете використовувати кешовані шари до моменту, коли ви додасте код програми в зображення.


8
Як загальний орієнтир, я вважаю, що COPYце кращий варіант, ADDякщо тільки вам не потрібна поведінка ADD.
Метрополіс

2
@Metropolis, ти цілком прав. Дякую за підказку.
helmbert

5
Погодьтеся з @Metropolis. ADDпотрібен лише в тому випадку, якщо <src>папка містить будь-який архів, який потрібно розпакувати або потрібно підтримувати віддалену обробку URL-адрес. {вихідний код}
Мохсін,

44

Про це прямо згадується у власних " Найкращих практиках написання файлів Docker" від Docker :

Якщо у вас є кілька кроків Dockerfile, які використовують різні файли з вашого контексту, КОПІЮЙТЕ їх окремо, а не всі одночасно. Це гарантуватиме, що кеш збірки кожного кроку буде недійсним (змушуючи крок повторно запускатися), лише якщо зміниться конкретно необхідні файли.

Наприклад:

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

Результат менша кількість ануляцій кешу для кроку RUN, ніж якщо ви встановите COPY. / tmp / перед ним.


0

Як швидший засіб для запуску файлу requirements.txt, не вводячи «так» для підтвердження встановлення бібліотек, ви можете переписати як:

COPY requirements.txt ./
RUN pip install -y -r requirements.txt
COPY ./"dir"/* .
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.