Может ли докерский слой "обойти" при сборке?
Давайте предположим, что у меня есть 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.