У меня есть несколько команд RUN в моем Dockerfile, которые я хотел бы запускать с -no-cache каждый раз, когда я создаю образ Docker.

Я понимаю, что docker build --no-cache отключит кеширование для всего Dockerfile.

Можно ли отключить кеш для конкретной команды RUN?

Vingtoft

Ответов: 8

Ответы (8)

Не напрямую, но вы можете разделить свой Dockerfile на несколько частей, построить образ, затем ИЗ этого образа в начале следующего Dockerfile и построить образ с кэшированием или без него

Еще один быстрый способ - записать несколько случайных байтов перед вашей командой

RUN head -c 5 /dev/random > random_bytes && 

записывает 5 случайных байтов, что приведет к пропуску кеш-памяти

С февраля 2016 года это невозможно.

The feature has been requested at GitHub

Если ваша цель - включить последний код из Github (или аналогичного), можно использовать Github API (или эквивалент) для получения информации о последней фиксации с помощью команды ADD.
сборка докера всегда будет получать URL-адрес из команды ADD, и если ответ отличается от полученного в последний раз сборка докера запускалась, он не будет использовать последующие кэшированные слои.

например,

ADD "https://api.github.com/repos/username/repo_name/commits?per_page=1" latest_commit
RUN curl -sLO "https://github.com/username/repo_name/archive/main.zip" && unzip main.zip

функция добавлена ​​неделю назад.

ARG FOO=bar

FROM something
RUN echo "this won't be affected if the value of FOO changes"
ARG FOO
RUN echo "this step will be executed again if the value of FOO changes"

FROM something-else
RUN echo "this won't be affected because this stage doesn't use the FOO build-arg"

https://github.com/moby/moby/issues/1996#issuecomment-550020843

Я считаю, что это небольшое улучшение по сравнению с ответом @teve, приведенным выше:

RUN git clone https://sdk.ghwl;erjnv;wekrv;qlk@gitlab.com/your_name/your_repository.git

WORKDIR your_repository

# Calls for a random number to break the cahing of the git clone
# (https://stackoverflow.com/questions/35134713/disable-cache-for-specific-run-commands/58801213#58801213)
ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache
RUN git pull

Это использует кеш Docker клона git, но затем запускает некэшированное обновление репозитория.

Кажется, что работает, и он быстрее, но большое спасибо @steve за предоставление основных принципов.

Используйте

ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache

перед строкой RUN, которую вы хотите запускать всегда. Это работает, потому что ADD всегда будет извлекать файл / URL-адрес, а указанный выше URL-адрес генерирует случайные данные для каждого запроса, затем Docker сравнивает результат, чтобы узнать, может ли он использовать кеш.

Я тоже это протестировал, и он отлично работает, поскольку не требует дополнительных аргументов командной строки Docker, а также работает с файлом Docker-compose.yaml :)

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

Как предложено в этом комментарии к проблеме, можно добавить блок аргументов сборки (имя может быть произвольным):

ARG CACHEBUST=1 

перед такой областью и изменяйте его значение при каждом запуске, добавляя - build-arg CACHEBUST = $ (date +% s) в качестве аргумента docker build (значение также может быть произвольным, здесь это текущее datetime, чтобы гарантировать его уникальность во всех прогонах).

• 100001 *

2022 WebDevInsider