So reduzieren Sie die Docker-Bildgröße

12

Ich habe einen Container mit GlassFish. Als ich versuchte, ein Bild festzuschreiben, wurden es 14 GB. Später habe ich /tmp/in dem Container gelöscht, der 10 GB groß war, und versucht, ein Bild festzuschreiben, aber das Bild ist immer noch 14 GB groß. Es scheint, dass das Löschen von Dateien aus dem Container nicht in der Bildgröße berücksichtigt wird. Wie behebe ich dieses Problem?

user1726453
quelle
1
Niemand kann wirklich Empfehlungen aussprechen, ohne etwas mehr über Ihr Setup zu wissen. Was ist die Docker-Datei? Was ist der Dateibaum, der dem Docker-Buildkontext hinzugefügt wird? Das offizielle glassfishDocker-Image ist ungefähr 1 GB groß. Während es für ein Docker-Bild verdammt groß ist, ist es immer noch viel kleiner als das, was Sie zu bauen scheinen.
Andy Shinn
In dieser SO-Frage finden Sie eine Anleitung. Auch diese Google - Suche hat eine Reihe von relevanten Artikeln.
Mischa Brukman

Antworten:

9

Das Problem, mit dem Sie möglicherweise konfrontiert sind, besteht darin, dass das Entfernen von Dateien in einem Commit nichts an der Tatsache ändert, dass die Datei in einem vorherigen Image vorhanden war, sodass das vorherige Image immer noch 14G beträgt.

Schauen Sie sich den Teil "Ebenen" in diesem Artikel an: http://woudenberg.io/reducing-docker-image-size/

Um dieses Problem zu beheben, müssen Sie die Elemente unter / tmp / innerhalb des ursprünglichen Commits entfernen, das sie generiert hat, damit das als Ergebnis dieses Commits erstellte Image sie nicht enthält. Dies ist bei der Verwendung von Docker-Dateien einfach, beim Erstellen von Bildern mit Commits jedoch nicht sicher, ob dies möglich ist.

Sie können möglicherweise auch Ebenen quetschen, indem Sie das Bild exportieren / importieren.

Juan Antonio Galán Martínez
quelle
4

Wenn Sie die Antwort von @Juan Antonio erweitern, Dockerfilewird dies keinen Platz sparen:

RUN apt-get install -y foo bar
...
RUN apt-get purge --auto-remove -y foo bar

Was Sie stattdessen tun müssen, ist:

RUN apt-get install -y foo bar && \
    && ... \
    && apt-get purge --auto-remove -y foo bar

Auf der anderen Seite bedeutet dies weniger Caching, als wenn sich etwas in dieser großen Befehlszeile ändert. Docker muss den gesamten Befehlssatz erneut ausführen.

Wernight
quelle