Praxis und Analyse der geschichteten Verpackung von Docker-Images für Spring Boot (empfohlen)

Praxis und Analyse der geschichteten Verpackung von Docker-Images für Spring Boot (empfohlen)

1. Bereiten Sie das Spring Boot-Projekt vor

Einfach, überspringen
Spring Boot-Version > 2.3.x kann einfach ein „Hallo Welt“ schreiben

2. Relevante Konfiguration durchführen

Viele Blogs im Internet betonen, dass Sie die pom.xml manuell konfigurieren müssen, um die geschichtete Verpackung zu aktivieren:

<Bauen>
    <Plugins>
        <Plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>Spring-Boot-Maven-Plugin</artifactId>
            <Konfiguration>
                <!--Unterstützung für abgestufte Kompilierung aktivieren-->
                <Ebenen>
                    <aktiviert>wahr</aktiviert>
                </Ebenen>
            </Konfiguration>
        </plugin>
    </plugins>
</bauen>

In Version 2.3.x ist es eine neue Funktion und muss manuell konfiguriert und aktiviert werden. Die aktuelle Spring Boot-Version (verwendet Version 2.6.1) erfordert jedoch keine manuelle Konfiguration und unterstützt diese Funktion standardmäßig. (Laut einigen Blogs ist es ab Version 2.4.x standardmäßig aktiviert)

In der aktuellen offiziellen Dokumentation (Version 2.6.0) heißt es auch, dass es standardmäßig unterstützt wird, eine manuelle Konfiguration jedoch nur erforderlich ist, wenn diese Funktion nicht benötigt wird:

Das neu gepackte Archiv enthält standardmäßig die Datei layers.idx . Um diese Funktion zu deaktivieren, können Sie dies folgendermaßen tun:

<Projekt>
   <Bauen>
       <Plugins>
           <Plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>Spring-Boot-Maven-Plugin</artifactId>
               <Konfiguration>
                   <Ebenen>
                       <aktiviert>falsch</aktiviert>
                   </Ebenen>
               </Konfiguration>
           </plugin>
       </plugins>
   </bauen>
</Projekt>

3. Paket

Führen Sie mvn package aus, um die JAR-Paketdatei zu packen und abzurufen.

Tatsächlich besteht das Wesentliche darin, das Neupaket des Spring-Boot-Maven-Plugins zu verwenden, um das vollständige JAR-Paket mit Abhängigkeiten und das ursprüngliche JAR-Paket zu erhalten (das Suffix .original wird automatisch hinzugefügt).
Öffnen Sie das JAR-Paket und Sie finden die Dateien classpath.idx und layers.idx im Ordner BOOT-INF. Öffnen Sie sie und sehen Sie sie sich an:

Klassenpfad.idx

– „BOOT-INF/lib/logback-classic-1.2.7.jar“

– „BOOT-INF/lib/logback-core-1.2.7.jar“

– „BOOT-INF/lib/log4j-to-slf4j-2.14.1.jar“

– „BOOT-INF/lib/log4j-api-2.14.1.jar“

– „BOOT-INF/lib/jul-to-slf4j-1.7.32.jar“

– „BOOT-INF/lib/jakarta.annotation-api-1.3.5.jar“

– „BOOT-INF/lib/snakeyaml-1.29.jar“

– „BOOT-INF/lib/jackson-databind-2.13.0.jar“

– „BOOT-INF/lib/jackson-annotations-2.13.0.jar“

– „BOOT-INF/lib/jackson-core-2.13.0.jar“

– „BOOT-INF/lib/jackson-datatype-jdk8-2.13.0.jar“

– „BOOT-INF/lib/jackson-datatype-jsr310-2.13.0.jar“

– „BOOT-INF/lib/jackson-module-parameter-names-2.13.0.jar“

– „BOOT-INF/lib/tomcat-embed-core-9.0.55.jar“

– „BOOT-INF/lib/tomcat-embed-el-9.0.55.jar“

– „BOOT-INF/lib/tomcat-embed-websocket-9.0.55.jar“

– „BOOT-INF/lib/spring-web-5.3.13.jar“

– „BOOT-INF/lib/spring-beans-5.3.13.jar“

– „BOOT-INF/lib/spring-webmvc-5.3.13.jar“

– „BOOT-INF/lib/spring-aop-5.3.13.jar“

– „BOOT-INF/lib/spring-context-5.3.13.jar“

– „BOOT-INF/lib/spring-expression-5.3.13.jar“

– „BOOT-INF/lib/spring-boot-2.6.1.jar“

– „BOOT-INF/lib/spring-boot-autoconfigure-2.6.1.jar“

– „BOOT-INF/lib/slf4j-api-1.7.32.jar“

– „BOOT-INF/lib/spring-core-5.3.13.jar“

– „BOOT-INF/lib/spring-jcl-5.3.13.jar“

– „BOOT-INF/lib/spring-boot-jarmode-layertools-2.6.1.jar“

Schichten.idx

- "Abhängigkeiten":

– „BOOT-INF/lib/“

- "Spring-Bootloader":

- "org/"

- „Snapshot-Abhängigkeiten“:

- "Anwendung":

– „BOOT-INF/Klassen/“

– „BOOT-INF/classpath.idx“

– „BOOT-INF/layers.idx“

- "META-INF/"

Überprüfen Sie noch einmal:

Mehrschichtige Informationen ok

4. Docker-Datei

Auch die Dockerfile-Datei ist relativ konventionell. Sie verwendet lediglich den Befehl „jarmode“, um das JAR-Paket zu dekomprimieren, bevor das Image gepackt wird. Während des Packvorgangs werden dann verschiedene Ebenen nacheinander kopiert, und die Anwendungsebene mit der größten Änderungsmöglichkeit wird am Ende platziert. Auf diese Weise können die vorherigen Ebenen, die keine Änderungen aufweisen, den Docker-Cache direkt verwenden, um die Packeffizienz zu verbessern.

VON eclipse-temurin:8-jre-focal als Builder

WORKDIR-Anwendung

ARG JAR_FILE=Ziel/*.jar

KOPIEREN SIE ${JAR_FILE} application.jar

RUN java -Djarmode=layertools -jar application.jar extract

VON eclipse-temurin:8-jre-focal

WORKDIR-Anwendung

KOPIEREN --from=Builder-Anwendung/Abhängigkeiten/ ./

KOPIEREN --from=Builder-Anwendung/Spring-Boot-Loader/ ./

KOPIEREN --from=Builder-Anwendung/Snapshot-Abhängigkeiten/ ./

KOPIEREN --from=Builder-Anwendung/Anwendung/ ./

ENV TZ="Asien/Shanghai"

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

ENV JVM_OPTS=""

ENV JAVA_OPTS=""

EINSTIEGSPUNKT ["sh","-c","java $JVM_OPTS $JAVA_OPTS org.springframework.boot.loader.JarLauncher"]

5. Anwendungsmodifikation und Tauchanalyse

Wenn Sie das Bild nur einmal verpacken, kommen die Vorteile der Schichtung tatsächlich nicht zum Tragen. Sie müssen also einige Inhalte ändern und sie dann erneut verpacken (oder mehrmals, aber das Wesentliche ist dasselbe, also ändern Sie sie hier nur einmal).
Ändern Sie einige Anwendungscodes:

Packen Sie das JAR-Paket neu und erstellen Sie ein neues Image, sodass Sie zwei Images erhalten:

Verwenden Sie „dive“, um die beiden Bilder zu analysieren:

Es kann festgestellt werden, dass bis zur Änderung der Anwendungsebene (Anwendung/Anwendung/) die ID und der Digest der Ebenen auf beiden Seiten genau gleich sind, sodass diese Ebenen wiederverwendet werden können und dieselbe Ebene nur einzeln im Docker-Verzeichnis gespeichert wird, wodurch die zum Kompilieren und Pushen des Containers erforderliche Zeit erheblich verkürzt werden kann.
(Das Verständnis der spezifischen Schichtung von Docker-Images ist noch begrenzt, und ich werde später mehr darüber erfahren.)

Dies ist das Ende dieses Artikels über die Praxis und Analyse des Docker-Image mit Spring Boot-Schichtverpackung. Weitere relevante Inhalte zum Docker-Image mit Spring Boot-Schichtverpackung finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Verstehen Sie die Implementierung der Docker-Image-Schichtung gründlich
  • Kenntnisse im Bereich Docker-Image-Layering und Dockerfile-Schreiben
  • Detaillierte Erklärung des Prinzips der Docker-Image-Schichtung
  • Eine kurze Analyse der Überlegungen zur Docker-Image-Schichtung
  • Tiefgreifendes Verständnis der Schichtung von Docker-Images (ein Muss für Anfänger)

<<:  Wie gestaltet man eine responsive Website? Vor- und Nachteile von Responsive Webdesign

>>:  HTML verwendet reguläre Ausdrücke zum Testen von Tabellenbeispielen

Artikel empfehlen

Analyse von MySQL-Latenzproblemen und Datenlöschungsstrategieprozess

Inhaltsverzeichnis 1. MySQL-Replikationsprozess 2...

Versprechenskapselung wx.request-Methode

Im vorherigen Artikel wurde die Implementierungsm...

Lösen Sie das Problem der Containerverwaltung mit Docker Compose

Im Docker-Design führt ein Container nur eine Anw...

MySQL- und SQLYog-Installationstutorial mit Bildern und Text

1. MySQL 1.1 MySQL-Installation mysql-5.5.27-winx...

Die Funktionen und Unterschiede zwischen deaktiviert und schreibgeschützt

1: schreibgeschützt dient zum Sperren dieses Steue...

So kapseln Sie Axios in Vue

Inhaltsverzeichnis 1. Installation 1. Einleitung ...

React-Diagramm Serialisierung JSON Interpretation Fallanalyse

Das Ziel dieses Dokuments ist es, die JSON-Serial...

Umfassende Website-Bewertungslösung

<br />Manchmal werden Ihnen möglicherweise F...

Untersuchung und Korrektur des seltsamen Verhaltens von parseInt() in js

Hintergrund: Ich frage mich, ob Ihnen aufgefallen...

CSS-Implementierungscode für verzerrte Schatten

Dieser Artikel stellt den Implementierungscode vo...

Automatisiertes Frontend-Deployment basierend auf Docker, Nginx und Jenkins

Inhaltsverzeichnis Vorbereitende Vorbereitung Ber...

VUE implementiert Saugknopf an der Unterseite

In diesem Artikelbeispiel wird der spezifische Co...

HTML-Cellpadding- und Cellspacing-Attribute in Bildern erklärt

Zelle -- der Inhalt der Tabelle Zellenrand (Tabell...