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.
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? –
@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
Der beste Weg, dies zu tun, ist ein Installations-Skript HINZUFÜGEN und es auszuführen. Ist das korrekt? –