Может ли докерский слой "обойти" при сборке?

Давайте предположим, что у меня есть Dockerfile, подобный этому:

FROM debian:stretch

RUN apt update
RUN apt install -y wget 

RUN wget https://stackru.com/
# I know the wget is useless. Is just an example :)
CMD ["echo", "hello-world"]

Я хочу перенести оператор wget, новый оператор RUN. После этого изменения, когда я перестрою, он перезапустит все команды от моей модификации до down, поэтому wget будет выполнен снова. Проблема в том, что команда wget занимает так много времени, потому что в моем реальном файле это очень большой файл.

Вопрос в том, можно ли "подправить" докер где-нибудь, чтобы избежать повторного построения выполнения слоя wget? Если я уже построил его, можно ли использовать этот слой снова, даже изменив оператор над ним?

Спасибо.

2 ответа

Решение

AFAIK это невозможно, так как докер только повторно использует слои до тех пор, пока вы не измените их, и не начнет строить заново.

Это потому, что новые слои тестируются на ранее построенных слоях (так что ваши RUN wget слой проверен и построен на слоях из FROM в RUN apt install -y wget). Так что, если вы введете другой RUN инструкция выше RUN wget инструкции, вы получите измененную среду для вашего RUN wget инструкция, поэтому она должна быть выполнена снова.

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

Использование docker-compose или флаг -v при запуске docker run Вы можете смонтировать том, который будет сохраняться между запусками. Измените свой wget на скрипт, который условно запускается при отсутствии файла.

Это не будет кэшировать позже, но сделает этот шаг быстрее.

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

Я использую compose для монтирования тома здесь: https://github.com/jaydorsey/ghgvcR/blob/master/docker-compose.yml

Посмотрите на файл bin/download-files.sh в этом репозитории для примера bash.

Другие вопросы по тегам