2014-01-30 19 views
14

Ich bemerkte, dass jede Zeile in der Dockerfile ein separates Bild erstellt. Gibt es eine Begrenzung für die Anzahl der erstellten Bilder?Anzahl der Befehle in Dockerfile

Sollten wir stattdessen versuchen, einen oneliner von zu machen?

Wie unterscheidet sich das, wenn wir einen Dienst wie Quay verwenden?

Danke!

Antwort

14

Wie Alister said gibt es eine obere Grenze für die Anzahl der Ebenen in einem Docker-Image, wenn Sie das Dateisystem AUFS verwenden. Bei Docker Version 0.7.2 wurde die Grenze auf 127 Ebenen erhöht (changelog).

Da dies eine Einschränkung des zugrunde liegenden Union-Dateisystems ist (im Falle von AUFS), wird die Verwendung von Quay oder anderen privaten Registrys das Ergebnis nicht ändern. Aber Sie könnten ein anderes Dateisystem verwenden.

Das aktuelle alternative Dateisystem ist devicemapper (siehe CLI docs). Diese anderen Dateisysteme haben möglicherweise unterschiedliche Beschränkungen für die Anzahl der Ebenen - ich glaube nicht, dass devicemapper eine Obergrenze hat.

Sie haben recht, wenn Sie mehrere Befehle in einer einzigen RUN-Anweisung ausführen, können Sie die Anzahl der Schichten reduzieren.

Wenn Sie für das Erstellen Ihres Bilds wirklich viele Ebenen benötigen, können Sie ein Bild erstellen, bis es das Maximum erreicht. Verwenden Sie dann docker export, um eine Kopie des Bilddateisystems zu erstellen. Dann docker import, um es wieder in ein Bild zu verwandeln, dieses Mal mit nur einer Schicht, und baue weiter. Sie verlieren jedoch die Geschichte auf diese Weise.

5

Es gibt eine Grenze von 42 - anscheinend eine harte Grenze von AUFS.

Es kann helfen, etwas vermieden werden, indem was in einzelnen RUN-Befehle in ein Skript getan wird, und dann dieses Skript ausgeführt wird. Sie würden dann mit einer einzelnen, größeren Bildschicht statt einer Anzahl kleinerer Dateien zum Zusammenführen enden. Kleinere Bilder (mit mehreren RUN-Zeilen) erleichtern den ersten Test (da ein neues Hinzufügen am Ende der RUNlist das vorherige Bild wiederverwenden kann), ist es typisch, dass Sie warten, bis sich Ihre Docker-Datei stabilisiert hat, bevor Sie die Zeilen zusammenführen.

Sie können auch die potentielle Anzahl von Bildern reduzieren, indem Sie eine ganze Anzahl von Dateien hinzufügen, anstatt eine Anzahl einzelner Dateien hinzuzufügen.

+0

Vielen Dank für Ihre Antwort. Wenn ich also ein Bild mit einer Dockerfile mit 41 Zeilen erzeuge und es zu Quay verschiebe und ein anderes Bild erzeuge, das mein Ausgangsbild von Quay als Basis verwendet, kann ich der Dockerfile weitere 41 Zeilen hinzufügen? –

+0

@RezaSanaie mein Verständnis ist, dass das nicht stimmt. Das erste Bild enthält 41 Ebenen. Wenn Sie davon abhängig sind, werden Sie diese 41 Ebenen haben, und dann noch alles, was Sie hinzufügen. AUFS wird verwendet, um einfach die Dateisysteme zu überlagern. Ich denke, das ist eine große Einschränkung in Docker, aber vielleicht warten sie darauf, dass AUFS mehr Layer Upstream behandelt. – d11wtq

+0

Der beste Weg, dies zu tun, ist ein Installations-Skript HINZUFÜGEN und es auszuführen. Ist das korrekt? –