Docker: можно ли не строить с нуля без использования кеша? - PullRequest
0 голосов
/ 09 апреля 2019

У меня был простой файл Docker:

FROM python:3.6
COPY . /app
WORKDIR /app
RUN pip install -r requirements

Проблема была в том, что он устанавливает требования для каждой сборки.У меня много требований, но они редко меняются.

Я искал решения и в итоге получил следующее:

FROM python:3.6
COPY requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip install -r requirements.txt
COPY . /app

Это прекрасно работало, пока не прекратило обновлять код.Например, прокомментируйте пару строк в каком-то файле, который идет в / app, и build-lines в изображении остаются без комментариев.

Я снова искал и обнаружил, что это, возможно, вызвано кешем.Я попробовал - без кеша флаг сборки, но теперь я снова получаю установку требований.

Есть ли какой-то обходной путь или правильный способ сделать это в моемситуация?

Ответы [ 3 ]

2 голосов
/ 09 апреля 2019

Вы когда-нибудь использовали docker-compose? Docker-compose имеет «тома», он как кеш, и когда вы запускаете контейнер, он не будет перестраивать ваши зависимости. Это автоматическое обновление, когда ваш код меняется. и с вашей ситуацией, вы должны сделать так:

FROM python:3.6
WORKDIR /app
COPY . /app
COPY requirements.txt ./
RUN pip install -r requirements.txt
CMD["python","app.py"]

Давай попробуем.

2 голосов
/ 09 апреля 2019

Вы должны использовать ADD, а не COPY, если хотите аннулировать кеш.

FROM python:3.6
COPY requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip install -r requirements.txt
ADD . /app

Попробуйте приведенный выше файл Docker.

1 голос
/ 09 апреля 2019

Изменение файла, в который вы просто копируете (COPY . /app), Docker не увидит, поэтому он будет использовать кэшированный слой *, отсюда и ваш результат. Использование --no-cache заставит пересобрать каждый слой, снова объясняя, что вы наблюдали.

Способ 'docker', позволяющий избежать переустановки всех требований каждый раз, состоял бы в том, чтобы поместить все статические требования в базовый образ, а затем использовать этот образ в строке FROM со всеми другими требованиями, которые меняются.


* Хотя я вполне уверен, что заметил, что если вы копируете именованный файл, а не каталог, изменения сохраняются даже без --no-cache

...