Как кешировать клонирование git repo в install.sh - PullRequest
0 голосов
/ 23 февраля 2019

Я создаю докер для своего приложения Flask.В приложении я использую модуль python, клонированный из github.Назовем его модулем A. Модуль A состоит из другого модуля, клонированного из git, назовем его модулем B. Модуль A имеет скрипт install.sh, в котором клонирован модуль B.Модуль B состоит из другого модуля (C), клонированного из git, и он клонируется из скрипта install.sh из модуля B. Поэтому в моем dockerfile я запускаю install.sh модуля A, он запускает install.sh модуля Bи он запускает install.sh модуля C.

flask_app
├── Dockerfile
├── A
|   ├── install.sh
|   ├── B
|       ├── install.sh
|       ├── C
|           ├── install.sh

Мне нужно изменить некоторый код в модуле A, чтобы он соответствовал моему приложению, поэтому я клонирую его вручную и изменяю код.

В dockerfile я использую

RUN cd ./A && ./install.sh

, который устанавливает все необходимые модули.Проблема в том, что он не использует кеш при сборке докера в другой раз.Это огромная проблема, потому что сборка модуля C занимает 1 час.Как я могу сделать Docker кэшировать эту команду?

Это весь файл Docker:

FROM python:2.7

RUN rm /bin/sh && ln -s /bin/bash /bin/sh

WORKDIR /app

RUN apt-get update
RUN pip install --upgrade pip

RUN apt-get update && \
      apt-get -y install sudo

ADD ./requirements.txt ./requirements.txt
RUN pip install -r requirements.txt

ADD . /app

RUN cd ./A && ./install.sh

ENV WEB_CONCURRENCY 5

CMD gunicorn app:app

1 Ответ

0 голосов
/ 23 февраля 2019

Кэширование слоя Docker довольно линейно: если что-то меняется на конкретном шаге, ни этот шаг, ни что-либо после него не будет кэшировано.

В частности, в этих двух строках:

ADD . /app
RUN cd ./A && ./install.sh

Если что-либо изменится где-либо в вашем исходном дереве, это приведет к тому, что шаг ADD не будет использовать кеш, что означает, что шаг RUN тоже не будет.

Если A каталог меняется нечасто, тогда вы можете просто скопировать и запустить его на своем собственном шаге:

COPY ./A/ /app/A/
RUN cd ./A && ./install.sh

COPY . /app

(Это тот же шаблон, что у вас уже есть для файла requirements.txt, по сути, по той же причинеЯ обычно предпочитаю от COPY до ADD, если я явно не хочу автоматического извлечения URL-адресов и извлечения архива.)

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