web-dev-qa-db-ja.com

Dockerfile命令がキャッシュされるのを防ぐにはどうすればよいですか?

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機能があるかどうか疑問に思っています。

29
h3nrik

ビルド時の引数を指定して、そのステップ以降のキャッシュを強制的にブレークできます。たとえば、Dockerfileに

ARG CACHE_DATE=not_a_date

そして、この引数に新しいビルドごとに新しい値を与えます。もちろん、最高のものはタイムスタンプです。

docker build --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) ...

値がスペースを含まない文字列であることを確認してください。そうしないと、Dockerクライアントは誤って複数の引数として受け取ります。

Issue 22832 の詳細な説明を参照してください。

26
Ruifeng Ma

docker build --no-cache は、コマンドのallのキャッシュを無効にします。

Dockerfile ADDコマンド キャッシュを無効にするために使用されます。 改善された 最近のdockerバージョンでは:

Dockerは、ADDを介して追加されたファイルをチェックサムし、キャッシュを使用するかどうかを決定することになっています。

したがって、追加されたファイルが変更された場合、ADDコマンドのキャッシュを無効にする必要があります。


Issue 1326 は他のヒントに言及しています:

これはうまくいきました。

RUN yum -y install firefox #redo

RUNコマンドに渡す文字列がとにかく変更されると、Dockerはステップ(およびその下のすべてのステップ)を再実行するように見えます-コメント

Dockerキャッシュは、先祖が変更されていない場合にのみ使用されます(次のコマンドは前のレイヤーに変更を追加するため、この動作は理にかなっています)。

キャッシュは、変更された文字がない場合に使用されます(したがって、スペースでさえキャッシュを無効にするのに十分です)。

29
VonC

ビルドファイルから引数を渡すことは、何らかの理由で機能しませんでした。キャッシュしたくないコマンドを最後のCMD命令に追加することで解決しました。

例えば:

CMD ["/bin/bash", "-c" , "python3 /foo.py && bash /bar.sh"]

今、キャッシュしたくないfoo.pyを実行してから、bar.shを実行しています。きれいではありませんが、動作します。

0
Ahmed