Java Apps mit Jib andocken

In diesem Tutorial werfen wir einen Blick auf Jib und wie es die Containerisierung von Java-Anwendungen vereinfacht.

Wir nehmen eine einfache Spring Boot-Anwendung und erstellen ihr Docker-Image mit Jib. Und dann veröffentlichen wir das Image auch in einer entfernten Registry.

Lesen Sie auch unser Tutorial zum Andocken von Spring Boot-Anwendungen mit dockerfile und d _ocker _ tool .

Jib ist ein Open-Source-Java-Tool, das von Google zum Erstellen von Docker-Images von Java-Anwendungen verwaltet wird. Es vereinfacht die Containerisierung, da damit keine docker-Datei geschrieben werden muss .

Und tatsächlich müssen wir docker nicht einmal installiert haben, um die Docker-Images selbst erstellen und veröffentlichen zu können.

Google veröffentlicht Jib sowohl als Maven- als auch als Gradle-Plugin. Das ist schön, weil Jib jedes Mal, wenn wir bauen, Änderungen an unserer Anwendung einfängt. Dies erspart uns separate Docker-Build/Push-Befehle und vereinfacht das Hinzufügen zu einer CI-Pipeline.

Es gibt auch ein paar andere Tools, wie Spotifys docker-maven-plugin und dockerfile-maven -Plugins, obwohl das erstere jetzt veraltet ist und das Letztere eine dockerfile erfordert.

Nehmen wir eine einfache Spring-Boot-Anwendung und machen sie mit Jib andocken.

Es wird ein einfacher GET-Endpunkt verfügbar gemacht:

http://localhost:8080/greeting

Was wir mit einem Spring MVC-Controller ganz einfach machen können:

@RestController
public class GreetingController {

    private static final String template = "Hello Docker, %s!";
    private final AtomicLong counter = new AtomicLong();

    @GetMapping("/greeting")
    public Greeting greeting(@RequestParam(value="name",
        defaultValue="World") String name) {

        return new Greeting(counter.incrementAndGet(),
          String.format(template, name));
    }
}

Wir müssen uns auch lokal einrichten, um uns bei dem Docker-Repository zu authentifizieren, für das wir bereitgestellt werden

In diesem Beispiel geben wir unsere DockerHub-Anmeldeinformationen an .m2/settings.xml :

<servers>
    <server>
        <id>registry.hub.docker.com</id>
        <username><DockerHub Username></username>
        <password><DockerHub Password></password>
    </server>
</servers>

Es gibt auch andere Möglichkeiten, die Anmeldeinformationen bereitzustellen. ** Die empfohlene Methode von Google ist die Verwendung von Hilfsprogrammen, mit denen die Anmeldeinformationen in einem verschlüsselten Format im Dateisystem gespeichert werden können. In diesem Beispiel hätten wir https://github.com/docker/docker-credential-helpers#available-programs [docker-credential-helpers (-) verwenden können, anstatt Klartext-Anmeldeinformationen in settings.xml zu speichern, was sehr viel ist sicherer, aber für dieses Tutorial einfach nicht geeignet.

Jetzt können wir jib-maven-plugin oder das Gradle-Äquivalent , bis verwenden, um unsere Anwendung mit einem einfachen Befehl zu containerisieren :

mvn compile com.google.cloud.tools:jib-maven-plugin:0.9.10:build -Dimage=$IMAGE__PATH

Dabei ist IMAGE__PATH der Zielpfad in der Containerregistrierung.

Um zum Beispiel das Bild baeldungjib/spring-jib-app zu DockerHub hochzuladen, würden wir Folgendes tun:

export IMAGE__PATH=registry.hub.docker.com/baeldungjib/spring-jib-app

Und das ist es! Dadurch wird das Docker-Image unserer Anwendung erstellt und zum DockerHub verschoben.

6. Vereinfachung des Maven-Befehls

Wir können unseren anfänglichen Befehl auch verkürzen, indem wir das Plugin in unserem pom konfigurieren, wie jedes andere Maven-Plugin.

<project>
    ...
    <build>
        <plugins>
            ...
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>0.9.10</version>
                <configuration>
                    <to>
                        <image>${image.path}</image>
                    </to>
                </configuration>
            </plugin>
            ...
        </plugins>
    </build>
    ...
</project>

Mit dieser Änderung können wir unseren Maven-Befehl vereinfachen:

mvn compile jib:build

Standardmäßig gibt Jib eine Reihe vernünftiger Vermutungen darüber ab, was wir wollen , wie beispielsweise FROM und ENTRYPOINT.

Nehmen wir einige Änderungen an unserer Anwendung vor, die auf unsere Bedürfnisse zugeschnitten sind.

Zunächst stellt Spring Boot standardmäßig Port 8080 bereit.

Angenommen, wir möchten, dass unsere Anwendung auf Port 8082 ausgeführt wird und durch einen Container verfügbar gemacht werden kann.

Natürlich nehmen wir die entsprechenden Änderungen in Boot vor. Danach können wir Jib verwenden, um es im Bild sichtbar zu machen:

<configuration>
    ...
    <container>
        <ports>
            <port>8082</port>
        </ports>
    </container>
</configuration>

Oder sagen wir, wir brauchen ein anderes FROM. Standardmäßig verwendet Jib das distro- java-Image .

Wenn wir unsere Anwendung auf einem anderen Basisimage ausführen möchten (z. B. alpine-java ), können wir sie auf ähnliche Weise konfigurieren:

<configuration>
    ...
    <from>
        <image>openjdk:alpine</image>
    </from>
    ...
</configuration>

Wir konfigurieren Tags, Volumes und https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin#extended-usage <mehrere andere Docker-Anweisungen]auf dieselbe Weise.

8. Anpassen von Java-Aspekten

Darüber hinaus unterstützt Jib auch zahlreiche Java-Laufzeitkonfigurationen:

  • _jvmFlags _ gibt an, welche Start-Flags an die JVM übergeben werden sollen.

  • __mainClass __ist für die Angabe der Hauptklasse, welche ** Jib verwendet wird

Versuchen Sie standardmäßig automatisch abzuleiten. ** In args geben wir die übergebenen Programmargumente an

die __main __methode.

In der Jib-Dokumentation finden Sie natürlich alle verfügbaren https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin-Konfigurationseigenschaften ].

In diesem Tutorial haben wir gesehen, wie man Docker-Images mit dem Jib von Google erstellt und veröffentlicht, einschließlich des Zugriffs auf die Docker-Anweisungen und Java-Laufzeitkonfigurationen über Maven.

Wie immer ist der Quellcode für dieses Beispiel verfügbar: over on Github .