У RUN
моєму файлі Docker є кілька команд, які я хотів би виконати -no-cache
кожного разу, коли будую образ Docker.
Я розумію, що docker build --no-cache
вимкне кешування для всього файлу Docker.
Чи можна вимкнути кеш для певної команди RUN?
У RUN
моєму файлі Docker є кілька команд, які я хотів би виконати -no-cache
кожного разу, коли будую образ Docker.
Я розумію, що docker build --no-cache
вимкне кешування для всього файлу Docker.
Чи можна вимкнути кеш для певної команди RUN?
Відповіді:
Завжди є можливість вставити якусь безглузду та дешеву для запуску команду перед регіоном, для якого потрібно вимкнути кеш.
Як пропонується у цьому коментарі до випуску , можна додати блок аргументів збірки (ім'я може бути довільним):
ARG CACHEBUST=1
перед такою областю, і змінюйте його значення кожного прогону, додаючи --build-arg CACHEBUST=$(date +%s)
як docker build
аргумент (значення також може бути довільним, тут це поточна дата-час, щоб забезпечити його унікальність для прогонів).
Це, звичайно, також вимкне кеш для всіх наступних блоків, оскільки хеш-сума проміжного зображення буде іншою, що робить по-справжньому вибірковий кеш відключенням нетривіальної проблеми, беручи до уваги, як зараз працює докер.
---> Using cache
під мій рядок `` ARG CACHEBUST = 1` ... (і так, я це зробив --build-arg CACHEBUST=$(date +%s)
у своїй команді
RUN echo "$CACHEBUST"
оскільки одне лише використання ARG
не призведе до втрати кеш-пам’яті
Використовуйте
ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache
перед рядком RUN, який ви хочете завжди запускати. Це працює, оскільки ADD завжди отримує файл / URL-адресу, і вищевказана URL-адреса генерує випадкові дані щодо кожного запиту, а потім Docker порівнює результат, щоб побачити, чи може він використовувати кеш.
Я також перевірив це і працює чудово, оскільки для цього не потрібні додаткові аргументи командного рядка Docker, а також працює з файлу Docker-compose.yaml :)
Не безпосередньо, але ви можете розділити свій файл Docker на кілька частин, побудувати зображення, а потім ВІД цього зображення на початку наступного файлу Docker і побудувати зображення з кешуванням або без нього
функція, додана тиждень тому.
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
Я вважаю, що це невелике покращення щодо відповіді @ steve вище:
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
# (/programming/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 для забезпечення основоположних принципів.
Ще один швидкий хак - це написати кілька випадкових байтів перед вашою командою
RUN head -c 5 /dev/random > random_bytes && <run your command>
виписує 5 випадкових байт, що змусить пропустити кеш