2017-10-30 1 views
2

Hinweis: Ich bin mir dessen bewusst question, aber es beantwortet meine Frage nicht oder vollständig, nicht targeting (aber Sie könnten etwas davon ableiten - Ich würde sagen, es sollte eine Ja/Nein-Frage dafür geben - hier ist es).Docker Squash und Layer: welche Layer zusammengeführt werden und welche noch geteilt werden

CASE:

  • Unter der Annahme, ich habe 3 Bilder, nannte man BASE, ein Childa und CHILDb, beide Childs FROM BASE tun.
  • Angenommen BASE mit einer Größe von 1 GB hat und vorausgesetzt, wir wissen nicht, oder sind besonders interessiert, wenn es zerquetscht wird oder nicht, da es nicht (IMHO) Materie sollte
  • Childa und CHILDb beide 10 Schichten mit einer Größe von jeweils hinzufügen 500MB
  • Angenommen, wir docker build --squash CHILDa verwendet, wenn Childa und CHILDb Schaffung

Frage:

beim Ziehen Childa und CHILDb aus der Registrierung, verstehe ich, dass Tragschichten pul sein zuerst geführt. Nun, meine Frage ist, was ist die genaue Größe der Bilder auf dem Laufwerk:

a) 1 GB (Basis) + 500 MB (Childa) + 500 MB (childB) = 2GB
b) (1 GB + 500 MB) + (1 GB + 500 MB) = 3GB

sind also die Schichten von BASE als in nicht --sqaush Fällen geteilt (dies wäre a) dann) oder sind sie nicht mit anderen geteilt, b) dann

ich verstehe, dass die Schichten aus BASE sollte nicht zerquetscht werden, wenn CHILDa gebaut und gequetscht wird, nur die in CHILDa erstellten Ebenen werden auf eine Ebene gequetscht, also sollte die Geschichte so aussehen:

  • BASE SCHICHT1
  • BASE SCHICHT2
  • BASE LAYER3
  • ...
  • Childa SCHICHT1 (zerdrückt)

Das heißt also, alle BASE Schichten geteilt werden sollte CHILDb bei der Übertragung und auch geteilt in Bezug auf Speicherplatz, wenn CHILDa und CHILDb beide gezogen werden. Dies würde bedeuten, a) wäre die Antwort.

Ich stelle diese Frage, um eine definitive Antwort zu haben, nicht auf der Suche nach einem Vorschlag oder einer Implikation basierend auf den Dokumenten. Wahrscheinlich sogar einen Test gemacht? Es wäre nicht das erste Mal, dass Dokumentation und technische Implementierung nicht zueinander passen (im Docker)

Antwort

1

Die Antwort ist A.Sie können sehen, was Docker ist leicht genug, um mit einem auf dem resultierenden Bild inspizieren zu tun:

Die ersten beiden Bilder bauen:

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

Vergleichen Sie die gesamten Speicherplatz auf der für ein Bild verwendet (die das Basisbild zählt in diesem Fall 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 

dieser Speicherplatz ist kumulativ, und wird in verschiedenen Bildern Zahl Schichten verwendet verdoppeln. Also müssen wir uns die tatsächlichen Schichten ansehen. Vergleichen Sie die Schichten für die drei Bilder (Basis, voll und zerquetscht) unter Verwendung eines docker inspect:

$ 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" 
] 

Das Basisbild nach oben geht 18a8691 Schicht ... Vergleichen Sie das mit vollen Zügen:

$ 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" 
] 

Das vollständige Bild hat dem Bild 5 Ebenen hinzugefügt. Betrachten der gequetschten:

$ 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" 
] 

Es wurde nur eine einzige neue Schicht hinzugefügt. Das Basisbild selbst wurde nicht gequetscht.

Auf Platte wird jede Schicht nur einmal gespeichert, so dass Sie nur das Basisbild zählen einmal für Festplattennutzung.

Hinweis, ich empfehle nicht Bilder in den meisten Szenarien Quetschen. Es bricht den Wert des Zwischenspeichers früherer Schichten innerhalb des Bildes. Stattdessen empfehle ich, die Dockerfile zu organisieren, um den Wert des Layer-Caching zu maximieren, und mehrstufige Builds zu verwenden, um eine Ebene auf eine einzelne Kopie herunterzufahren, wenn systemischer Overhead vorliegt.

+0

ausgezeichnete Antwort am auch eine gute Anleitung, wie man es selbst zu genehmigen. Danke BMitch! –

+1

nur als Randnotiz, in fast all meinen Tests auch auf den Bildern mit etwa 80 Schichten auf, Quetschen hatten einen sehr geringen Einfluss, auch wenn die Bildgröße relativ groß betrachtet werden sollte (1,5 GB). Ich denke, es kommt immer noch darauf an, die Best Practice zu verwenden, um Ihre Operation zu bereinigen, nachdem Sie etwas getan haben, denn nur so bleibt das Bild klein. Wie "apt-get update && installiere && rm/var/lib/apt && autoremove" alles in einer Zeile, einschließlich der Installation von Essentials und dem Entfernen oder besser - erstelle ein Builder-Image um das Artefakt zu erstellen und installiere es einfach auf dem Image –

+0

Der wahre Wert von Squashing ist, wenn Sie viele Daten in einer Ebene hinzufügen, die Sie später ändern oder löschen. Wenn Sie die Best Practices befolgen, indem Sie diese in einen RUN-Schritt zusammenführen, geht der Wert verloren und Sie haben den Nachteil, dass kein Layer zwischengespeichert wird. – BMitch

Verwandte Themen