RUN
Dockerファイルには-no-cache
、Dockerイメージをビルドするたびに実行したいコマンドがいくつかあります。
docker build --no-cache
Dockerfile全体のキャッシュが無効になることを理解しています。
特定のRUNコマンドのキャッシュを無効にすることは可能ですか?
RUN
Dockerファイルには-no-cache
、Dockerイメージをビルドするたびに実行したいコマンドがいくつかあります。
docker build --no-cache
Dockerfile全体のキャッシュが無効になることを理解しています。
特定のRUNコマンドのキャッシュを無効にすることは可能ですか?
回答:
キャッシュを無効にする領域の前に、意味のない実行コストの低いコマンドを挿入するオプションが常にあります。
この問題のコメントで提案されているように、ビルド引数ブロックを追加できます(名前は任意です)。
ARG CACHEBUST=1
そのような領域の前に--build-arg CACHEBUST=$(date +%s)
、docker build
引数として追加することにより、実行ごとにその値を変更します(値は任意にすることもできます。ここでは、実行全体での一意性を確保するために、現在の日時です)。
もちろん、これにより、後続のすべてのブロックのキャッシュも無効になります。これは、中間イメージのハッシュ合計が異なるため、Dockerの現在の動作を考慮して、真に選択的なキャッシュが重要な問題を無効にするためです。
---> 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ファイルからも機能するためうまく機能します:)
直接ではありませんが、Dockerfileをいくつかの部分に分割し、イメージをビルドしてから、次のDockerfileの先頭でこのイメージをFROMし、キャッシュの有無にかかわらずイメージをビルドできます。
この機能は1週間前に追加されました。
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
これは、git cloneのDockerキャッシュを使用しますが、リポジトリのキャッシュされていない更新を実行します。
それは機能しているように見え、より高速ですが、基本的な原則を提供してくれた@steveに感謝します。