2017-10-30 5 views
2

ヒント:これはquestionですが、正確には完全に私の質問に答えるものではありませんが、 - 私はそこにはい/いいえの質問があるはずです - ここにあります)。ドッカースカッシュとレイヤー:マージされていて、まだ共有されているレイヤー

CASE:

  • 私は両方のチャイルズはFROM BASEを行い、3個のイメージ、1と呼ばれるBASE、1 CHILDaとCHILDbを持っていると仮定。
  • BASEが1GBのサイズを持ち、それが問題ではないので、わからない、または特に興味がないものと仮定して(IMHO)
  • CHILDaとCHILDbはそれぞれ10

    レジストリからCHILDaとCHILDbを引いたとき、私はBASE層はPULになることを理解:500メガバイト

  • はCHILDaとCHILDb

質問を作成するときに、我々はdocker build --squash CHILDaを使用したと最初に導かれた。

a)は1ギガバイト(ベース)+ 500メガバイト(CHILDa)+ 500メガバイト(childB)= 2ギガバイト
B)(1ギガバイト+ 500メガバイト)+:さて、私の質問は、ドライブ上の画像の正確なサイズは何ですか(1ギガバイト+ 500メガバイト)= 3ギガバイト

だからBASEの層は非--sqaush例のように共有されている(これはその後a)だろう)、またはそれらは、b)はその後

私は理解して、その基本からの層はすべきで共有されていませんCHILDaがビルドされ、押しつぶされたときに押しつぶされず、CHILDaで作成されたレイヤーだけが1つのレイヤーに押しつぶされるので、履歴は次のようになります。

  • BASEレイヤ1
  • BASE LAYER2
  • BASE LAYER3
  • ...
  • CHILDaレイヤ1(ぺしゃんこ)

手段は、全てのベースレイヤーはと共有しなければならないようにするためCHILDbの転送時にも、CHILDaとCHILDbの両方が引っ張られたときにディスクスペースに関して共有されます。これは答えがa)であることを意味します。

私はこの質問に明確な答えを求めていますが、ドキュメントに基づいた示唆や示唆を探していません。おそらくテストされてバックアップされますか?ドキュメントと技術的な実装が互いに合っていないのは初めてです(ドッカーで)

答えて

1

答えはA.です。あなたはドッカーは、結果として得られる画像に検査で簡単に十分にやっているかを見ることができます。

まず、2枚の画像を構築:

$ docker build -t jenkins-blueocean:full . 
$ docker build -t jenkins-blueocean:squash --squash . 

は、ベースイメージをカウントする(画像のために使用される総ディスク容量を比較しますこの場合、jenkins/jenkins):

$ docker image ls jenkins/jenkins:2.77   
REPOSITORY   TAG     IMAGE ID   CREATED    SIZE 
jenkins/jenkins  2.77    1a057287c665  6 weeks ago   814MB 
$ docker image ls jenkins-blueocean:full 
REPOSITORY   TAG     IMAGE ID   CREATED    SIZE 
jenkins-blueocean full    773f9e1cbd94  3 minutes ago  1.29GB 
$ docker image ls jenkins-blueocean:squash 
REPOSITORY   TAG     IMAGE ID   CREATED    SIZE 
jenkins-blueocean squash    9a8816dcc900  2 minutes ago  1.28GB 

このディスクスペースは累積的であり、異なるイメージで使用されるレイヤ数を2倍にします。実際のレイヤーを見る必要があります。 docker inspectを使用して、3枚の画像(ベース、フル、および押しつぶさ)のためのレイヤーを比較:

$ docker inspect -f '{{json .RootFS.Layers}}' jenkins/jenkins:2.77 | jq . 
[ 
    "sha256:45f0f161f0749d09482ed1507925151b22b1f8c0c85970fe0857d61e530264b4", 
    "sha256:560ec518567f4117ed651db78b9c46eee39e00f38a87d6200ad7c87b79432064", 
    "sha256:deccd4ec00609f5f711578af469ce4ff43a5c73efc52517fc8ca362ebd36860c", 
    "sha256:23543e96fe44ca57a96d8552a6d9d218f7aa93b928a1ec8bafcaa9df3cc5723b", 
    "sha256:3de9ccb39b3bcf90c9215a49a84b340fedad87840d0580ffe0f0e0e8a1cb1f53", 
    "sha256:559298d0ee994bb9f12a77b1acc6fdfb6c7120cbcadfd640f7a9d171729b2cb1", 
    "sha256:4dc9d0cb0b3ca0f565aa29c7762f7322ece1e1fb51711feac3a52f3c20a28d2f", 
    "sha256:93d818bcd1d5eb6c689e6964e89feb8a8a3a394a998552c540b7db74986266c7", 
    "sha256:ac3d4345fe0474e18265fbb999fe6ab1c077fbb59876317406c7974c75c7ab5d", 
    "sha256:83a60a36cc44ca6fdab64823e805a853106be334239eb9d43cc1b220bb6ad238", 
    "sha256:7c78d70f156aaaee25540c9100ca28b68b554a966d448079896c413ae71a0e5d", 
    "sha256:cfd8defeb8a79686260691ce89a36772b21af0f736628492c835bb8a5740b817", 
    "sha256:fc4dc905efd22f932b74f95b53904736bebf52c2033e9853c54efb0b3f01560f", 
    "sha256:456fa2e1bb798ba4ccc5d433013973772b673dfff1f1386f18ceffe7d18132da", 
    "sha256:2446924bd5315bf6c46e8a5db2b61247da4ded48f4de148c15f8f5a2f9b1e91a", 
    "sha256:5a4416e8de72a14e97b53484e6016cc8a5b79398a25eb3b80fa099740b9f32e3", 
    "sha256:20901b1036e739e01c99d83e461059b3974003835a31e473f348fd70ece6c4e3", 
    "sha256:6d9d9244ead270d545d5de253a6ebb95398a7c63b10977c5cf7345b1cbf7d201", 
    "sha256:056fab22f880b32a4bbe4725b5b227891290097fd3791af452e52eb98b02cfb4", 
    "sha256:18a8691ee145f81f617bf788f39617f46d84b9924911317e6226139074b1f3e1" 
] 

このベースイメージがフルとその比較... 18a8691を層まで行く:

$ docker inspect -f '{{json .RootFS.Layers}}' jenkins-blueocean:full | jq . 
[ 
    "sha256:45f0f161f0749d09482ed1507925151b22b1f8c0c85970fe0857d61e530264b4", 
    "sha256:560ec518567f4117ed651db78b9c46eee39e00f38a87d6200ad7c87b79432064", 
    "sha256:deccd4ec00609f5f711578af469ce4ff43a5c73efc52517fc8ca362ebd36860c", 
    "sha256:23543e96fe44ca57a96d8552a6d9d218f7aa93b928a1ec8bafcaa9df3cc5723b", 
    "sha256:3de9ccb39b3bcf90c9215a49a84b340fedad87840d0580ffe0f0e0e8a1cb1f53", 
    "sha256:559298d0ee994bb9f12a77b1acc6fdfb6c7120cbcadfd640f7a9d171729b2cb1", 
    "sha256:4dc9d0cb0b3ca0f565aa29c7762f7322ece1e1fb51711feac3a52f3c20a28d2f", 
    "sha256:93d818bcd1d5eb6c689e6964e89feb8a8a3a394a998552c540b7db74986266c7", 
    "sha256:ac3d4345fe0474e18265fbb999fe6ab1c077fbb59876317406c7974c75c7ab5d", 
    "sha256:83a60a36cc44ca6fdab64823e805a853106be334239eb9d43cc1b220bb6ad238", 
    "sha256:7c78d70f156aaaee25540c9100ca28b68b554a966d448079896c413ae71a0e5d", 
    "sha256:cfd8defeb8a79686260691ce89a36772b21af0f736628492c835bb8a5740b817", 
    "sha256:fc4dc905efd22f932b74f95b53904736bebf52c2033e9853c54efb0b3f01560f", 
    "sha256:456fa2e1bb798ba4ccc5d433013973772b673dfff1f1386f18ceffe7d18132da", 
    "sha256:2446924bd5315bf6c46e8a5db2b61247da4ded48f4de148c15f8f5a2f9b1e91a", 
    "sha256:5a4416e8de72a14e97b53484e6016cc8a5b79398a25eb3b80fa099740b9f32e3", 
    "sha256:20901b1036e739e01c99d83e461059b3974003835a31e473f348fd70ece6c4e3", 
    "sha256:6d9d9244ead270d545d5de253a6ebb95398a7c63b10977c5cf7345b1cbf7d201", 
    "sha256:056fab22f880b32a4bbe4725b5b227891290097fd3791af452e52eb98b02cfb4", 
    "sha256:18a8691ee145f81f617bf788f39617f46d84b9924911317e6226139074b1f3e1", 
    "sha256:679b85b8d42598a7ecb5988e408da49cbb3f86402fd2e5694104839ff17a7015", 
    "sha256:5fa620489d92edd3e7922d9335d803ea83c148793044e0da99144152f7988437", 
    "sha256:17d03c6eda4a4d989f6751bb53d7bf356309938a1076af75bdf440195471fa2b", 
    "sha256:7a78b2c7c995ddab1ba675aba1c2bc54cc289ba148fd39b600f592060d98c459", 
    "sha256:f56b6c3fd8713236d077a95568a58445e6d6423113c0b68c6f10bef39bd6b6ff" 
] 

フルイメージは5つのレイヤーをイメージに追加しました。押しつぶされたものを見る:

$ docker inspect -f '{{json .RootFS.Layers}}' jenkins-blueocean:squash | jq . 
[ 
    "sha256:45f0f161f0749d09482ed1507925151b22b1f8c0c85970fe0857d61e530264b4", 
    "sha256:560ec518567f4117ed651db78b9c46eee39e00f38a87d6200ad7c87b79432064", 
    "sha256:deccd4ec00609f5f711578af469ce4ff43a5c73efc52517fc8ca362ebd36860c", 
    "sha256:23543e96fe44ca57a96d8552a6d9d218f7aa93b928a1ec8bafcaa9df3cc5723b", 
    "sha256:3de9ccb39b3bcf90c9215a49a84b340fedad87840d0580ffe0f0e0e8a1cb1f53", 
    "sha256:559298d0ee994bb9f12a77b1acc6fdfb6c7120cbcadfd640f7a9d171729b2cb1", 
    "sha256:4dc9d0cb0b3ca0f565aa29c7762f7322ece1e1fb51711feac3a52f3c20a28d2f", 
    "sha256:93d818bcd1d5eb6c689e6964e89feb8a8a3a394a998552c540b7db74986266c7", 
    "sha256:ac3d4345fe0474e18265fbb999fe6ab1c077fbb59876317406c7974c75c7ab5d", 
    "sha256:83a60a36cc44ca6fdab64823e805a853106be334239eb9d43cc1b220bb6ad238", 
    "sha256:7c78d70f156aaaee25540c9100ca28b68b554a966d448079896c413ae71a0e5d", 
    "sha256:cfd8defeb8a79686260691ce89a36772b21af0f736628492c835bb8a5740b817", 
    "sha256:fc4dc905efd22f932b74f95b53904736bebf52c2033e9853c54efb0b3f01560f", 
    "sha256:456fa2e1bb798ba4ccc5d433013973772b673dfff1f1386f18ceffe7d18132da", 
    "sha256:2446924bd5315bf6c46e8a5db2b61247da4ded48f4de148c15f8f5a2f9b1e91a", 
    "sha256:5a4416e8de72a14e97b53484e6016cc8a5b79398a25eb3b80fa099740b9f32e3", 
    "sha256:20901b1036e739e01c99d83e461059b3974003835a31e473f348fd70ece6c4e3", 
    "sha256:6d9d9244ead270d545d5de253a6ebb95398a7c63b10977c5cf7345b1cbf7d201", 
    "sha256:056fab22f880b32a4bbe4725b5b227891290097fd3791af452e52eb98b02cfb4", 
    "sha256:18a8691ee145f81f617bf788f39617f46d84b9924911317e6226139074b1f3e1", 
    "sha256:e05668bb7cbab8f964ea3512a9ce41568330218e0e383693ad9edfd1befce9aa" 
] 

ただ1つの新しいレイヤーが追加されました。ベース画像自体は押しつぶされていませんでした。

ディスク上では、各レイヤーは1回だけ保存されるため、ディスク使用のためにベースイメージを1回カウントします。

大部分のシナリオでは、イメージを縮めないことをおすすめします。これは、画像内の以前のレイヤの画像レイヤキャッシングの価値を破壊します。代わりに、レイヤーキャッシングの価値を最大限にするためにDockerfileを整理し、いくつかのシステムオーバヘッドがある場合には、マルチステージビルドを使用してレイヤーを1つのコピーにすることを推奨します。

+0

優秀な回答また、あなた自身でそれを承認する方法も良いガイドです。ありがとうBMitch! –

+1

ちょうど助言として、ほぼすべての私のテストでは、上に約80のレイヤーを持つ画像でさえ、画像のサイズがかなり大きかった(1.5GB)場合でも、スクラッシングはほとんど影響を与えませんでした。画像を小さく保つための唯一の方法として何かをやった直後に、あなたの操作をクリーンアップするためのベストプラクティスを使用することにまでは至っています。 build-essentialsをインストールして削除するなど、 'apt-get update && install && rm/var/lib/apt && autoremove'のように一行ですべてを行います - ビルダーイメージを作成してアーティファクトを構築し、 –

+0

スカッシュの実際の価値は、後で変更または削除する1つのレイヤーにたくさんのデータを含める場合です。これを1つのRUNステップに統合してベストプラクティスを実行すると、価値がなくなり、レイヤーキャッシュがないという欠点が残されます。 – BMitch

関連する問題