2017-11-10 8 views
0

ドッカー画像があり、それを平らにしたり縮めたりして、サイズを小さくするとします。これは、ランタイムアーチファクトのために有益です。そのため、ストレージやプッシュ/プルに必要なリソースを最小限に抑えることができます。ドッキング・イメージを押しつぶしたり平坦化したりしても、レジストリ・キャッシングに悪影響を及ぼしませんか?

しかし、画像を保存するためにコンテナレジストリの部分で起こる平坦化(単一の押しつぶされたレイヤーを生成する)とレイヤー再利用の間にトレードオフがあるのだろうかと思います。

ここでは例を示します。通常の古いDockerイメージである複数のレイヤーを持つイメージがあり、サイズは500 MBであるとします。圧縮または平滑化を使用して、250 MBのサイズの単一のレイヤーに圧縮します。

ここで画像を変更してバージョン2を作成する必要があるとしましょう。バージョン2はコンテナの後期レイヤーでの微妙な変更です。CMD命令の直前に設定ファイルの名前を変更することがありますか何か。

拡張されたレイヤーをレジストリにプッシュした場合、この新しいイメージをプッシュすると、異なる最終レイヤーのみがレジストリのキャッシュに格納される必要があります。サイズ(最初のイメージと新しいバージョン2イメージを一緒にする)は、変更された最後のレイヤーに応じて、550 MBなどとなります。

一方、それを平坦化した場合、新しいバージョン2イメージは、元のコンテナと共通の履歴を持たない全く新しい単層イメージに過ぎません。 ローカル Dockerインスタンスには、平坦化に関連するレイヤの履歴が表示されますが、のレジストリにはそのレイヤ履歴はありません)。

この場合、レジストリに約500 MBを保存する必要があります。画像の最初と2番目のバージョンではそれぞれ250 MBです。

これを3回目にするとすぐに、フラット化された画像の合計のスペースは、実際にはの拡張レイヤーイメージの増分変更のスペースよりも大きくなります。

私はこの仕組みについて何か不足していますか?コンテナを最終的な使用先に出荷する前に、フラット化を実行したいだけですが、ではなく、は通常、レジストリに格納する際にフラット化を行いたいと考えています。

ベースイメージが非常に大きく、平坦化がそれほど大きなサイズ縮小をもたらす場合がありますが、一般的なケースを理解しようとしていますが、レイヤのこの特定の側面について説明するドキュメントは見つかりません平らにする。

答えて

1

イメージをスクラッシュすると、キャッシュされたイメージレイヤを使用できなくなり、イメージのコピーが複数ある場合に使用されるディスク領域が増えます。このような理由から私はまだそれを私のクライアントと一緒に使うのを見てきました。これを行うための好ましい方法は、Dockerfileを最大化するように設定して、イメージの以前のビルドのキャッシュを再利用することです。

画像サイズがスカッシュから50%縮小されている場合は、Dockerfileを構造化してレイヤーの盛り上がりを防ぐより良い方法があります。私が知っている一般的な状況は、文脈から大きいファイルをCOPYでコピーしてから、後でRUNコマンドでそのファイルを修正したり削除したりする必要がある場合です。 COPYRUNコマンドを一緒にチェーンする方法はありません。COPYRUN curl http://local-artifact-repo/...に変換できる場合があります。または、複数ステージのビルドでは、すべてのCOPYコマンドと他のRUNコマンドを1つのステージで実行し、次にCOPYの結果を最終的なイメージで実行できるようになりました。最後のCOPYは、わずかな変更しか行わなかったとしても全く新しいレイヤーになりますが、コマンドをRUNにチェーンすることになります。

関連する問題