Dockerfile
では、curl
またはADD
を使用して、次のような最新バージョンのアーカイブをダウンロードします。
FROM debian:jessie
...
RUN apt-get install -y curl
...
RUN curl -sL http://example.com/latest/archive.tar.gz --output archive.tar.gz
...
ADD http://example.com/latest/archive2.tar.gz
...
RUN
またはcurl
を使用するADD
ステートメントは、独自の画像レイヤーを作成します。これは、今後docker build
を実行するためのキャッシュとして使用されます。
質問:その命令のキャッシュを無効にするにはどうすればよいですか?
キャッシュの無効化のようなものをそこで動作させることは素晴らしいことです。例えば。 HTTP ETags を使用するか、last modifiedヘッダーフィールドを照会します。これにより、HTTPヘッダーに基づいてクイックチェックを実行し、キャッシュされたレイヤーを使用できるかどうかを判断できる可能性があります。
私はいくつかの汚いトリックが役立つかもしれないことを知っています代わりにRUN
ステートメントでダウンロードシェルスクリプトを実行します。そのファイル名は、ビルドシステムによってdocker build
がトリガーされる前に変更されます。そして、そのスクリプト内でHTTPチェックを行うことができました。ただし、最後に使用したETagまたはlast modifiedをファイルに保存する必要があります。ここで使用できるクリーンなnativeDocker機能があるかどうか疑問に思っています。
ビルド時の引数を指定して、そのステップ以降のキャッシュを強制的にブレークできます。たとえば、Dockerfileに
ARG CACHE_DATE=not_a_date
そして、この引数に新しいビルドごとに新しい値を与えます。もちろん、最高のものはタイムスタンプです。
docker build --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) ...
値がスペースを含まない文字列であることを確認してください。そうしないと、Dockerクライアントは誤って複数の引数として受け取ります。
Issue 22832 の詳細な説明を参照してください。
docker build --no-cache は、コマンドのallのキャッシュを無効にします。
Dockerfile ADDコマンド キャッシュを無効にするために使用されます。 改善された 最近のdockerバージョンでは:
Dockerは、ADDを介して追加されたファイルをチェックサムし、キャッシュを使用するかどうかを決定することになっています。
したがって、追加されたファイルが変更された場合、ADD
コマンドのキャッシュを無効にする必要があります。
Issue 1326 は他のヒントに言及しています:
これはうまくいきました。
RUN yum -y install firefox #redo
RUN
コマンドに渡す文字列がとにかく変更されると、Dockerはステップ(およびその下のすべてのステップ)を再実行するように見えます-コメント。Dockerキャッシュは、先祖が変更されていない場合にのみ使用されます(次のコマンドは前のレイヤーに変更を追加するため、この動作は理にかなっています)。
キャッシュは、変更された文字がない場合に使用されます(したがって、スペースでさえキャッシュを無効にするのに十分です)。
ビルドファイルから引数を渡すことは、何らかの理由で機能しませんでした。キャッシュしたくないコマンドを最後のCMD命令に追加することで解決しました。
例えば:
CMD ["/bin/bash", "-c" , "python3 /foo.py && bash /bar.sh"]
今、キャッシュしたくないfoo.pyを実行してから、bar.shを実行しています。きれいではありませんが、動作します。