Verwandeln Sie Java-Apps mit Jib ~ Build with gradle ganz einfach in Docker-Container und registrieren Sie sich im lokalen Repository

Überblick

In diesem Eintrag werde ich versuchen, eine Java-Anwendung mithilfe von Jib, das von Google veröffentlicht wurde, einfach in einen Docker-Container zu verwandeln.

Der Inhalt, den wir überprüfen, ist fast der gleiche wie der auf der Gradle-Plug-In-Site von Jib, aber die folgenden beiden Punkte unterscheiden sich.

Annahme

Die Middleware und die Bibliothek verwenden Folgendes.

Zielgruppe

Für folgende Leser:

Verwandte Einträge

Ab dem 16. Juli 2018 gab es den folgenden Eintrag auf Qiita mit dem Schlüsselwort Jib.

Vorbereitung der Entwicklungsumgebung

JDK

Beziehen Sie "jdk-8u171-macosx-x64.dmg" von der Distributionsquellensite und starten Sie das Installationsprogramm von der dmg-Datei.

spring (CLI)

Installieren Sie das Befehlszeilenprogramm, um eine Beispiel-App zu erstellen. (Dies ist nicht erforderlich. Es reicht aus, auf das Beispiel auf GitHub zu verweisen.)

Installieren Sie mit sdkman.

$ sdk install springboot

Bereiten Sie die Anwendung vor

Bereiten Sie den Quellcode der Anwendung vor, die mit Gradle mithilfe der CLI von Spring Boot erstellt werden kann.

$ spring init -d=web --build=gradle jib-test Using service at https://start.spring.io Project extracted to '/Users/hiroki/jib-test'

Sanierung

Die Hauptklasse des Projekts wurde wie folgt geändert, um als RestController zu fungieren. (Es tut mir leid für die Auslassung) Diese Quelle ist auf GitHub als Tag 1.0 gespeichert.

package com.example.jibtest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

    @RequestMapping("/")
    @GetMapping
	public String hello() {
        return "Hello World!";
    }

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}

Stellen Sie sicher, dass die Anwendung ausgeführt werden kann

Starten Sie die Anwendung mit gradlew.

$ cd jib-test
$ ./gradrew bootRun

Stellen Sie sicher, dass die Anwendung auf Port 8080 in Ihrer lokalen Umgebung ausgeführt wird.

$ curl http://localhost:8080/
Hello World!

Bauen

Angenommen, Sie sind bereit und der Docker-Dämon wird ausgeführt, verwenden Sie gradle, um den Container zu erstellen.

「gcr.io/distroless/java」が利用されていることがわかります。

$ gradle jibDockerBuild
Tagging image with generated image reference jib-test:0.0.1-SNAPSHOT. If you'd like to specify a different tag, you can set the jib.to.image parameter in your build.gradle, or use the --image=<MY IMAGE> commandline flag.
warning: Base image 'gcr.io/distroless/java' does not use a specific image digest - build may not be reproducible

Containerizing application to Docker daemon as jib-test:0.0.1-SNAPSHOT...

Getting base image gcr.io/distroless/java...
Building dependencies layer...
Building resources layer...
Building classes layer...
Finalizing...
Loading to Docker daemon...
(Folgendes wird weggelassen)

Stellen Sie sicher, dass Sie ein Bild haben. (Hmm, ist es nicht süß, dass der Zeitstempel seltsam ist? Da dieses Jahr 2018 ist, scheint es, dass ich in Bezug auf die Berechnung irgendwie von 1970 abgezogen habe.) Die Größe betrug 134 MB.

$ docker images | grep jib-test
jib-test            0.0.1-SNAPSHOT      2ce8c6f47c83        48 years ago        134MB

Ich werde es starten. Beachten Sie, dass wir Port 8080 für den Host verfügbar machen und die Version "0.0.1-SNAPSHOT" angeben, die mit dem Gradle-Plug-In erstellt wurde.

$ docker run -p 8080:8080 -it jib-test:0.0.1-SNAPSHOT 

Stellen Sie sicher, dass Ihre Anwendung genauso funktioniert wie vor der Containerisierung.

$ curl http://localhost:8080/
Hello World!

wohlfühlen. Die Projekte bis zu diesem Punkt werden in GitHub als "Add-Gradle-Plugin" gespeichert.

Da es auf Distroless läuft, existiert die JavaVM-Binärdatei,

$ docker exec -it 481fc8ea9d2a java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-1~deb9u1-b11)
OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)

/ bin / bash existiert nicht.

$ docker exec -it 481fc8ea9d2a /bin/bash
OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown

Unter dem Build-Verzeichnis befand sich ein Verzeichnis namens Jib-Cache, in dem sich eine tar.gz-Datei mit einer Größe von einem Dutzend MB befand.

Inhalt der Datei tar.gz unter build / jib-cache
$ tar tvf dc3bf5c6afa437de068b6d692f7bd72e29fd7501577c2886c946f719fc3be05f.tar.gz
-rw-r--r--  0 0      0       65100  1  1  1970 app/libs//classmate-1.3.4.jar
-rw-r--r--  0 0      0     1133563  1  1  1970 app/libs//hibernate-validator-6.0.10.Final.jar
-rw-r--r--  0 0      0       66519  1  1  1970 app/libs//jackson-annotations-2.9.0.jar
-rw-r--r--  0 0      0      323848  1  1  1970 app/libs//jackson-core-2.9.6.jar
-rw-r--r--  0 0      0     1349339  1  1  1970 app/libs//jackson-databind-2.9.6.jar
-rw-r--r--  0 0      0       33395  1  1  1970 app/libs//jackson-datatype-jdk8-2.9.6.jar
-rw-r--r--  0 0      0       99987  1  1  1970 app/libs//jackson-datatype-jsr310-2.9.6.jar
-rw-r--r--  0 0      0        8645  1  1  1970 app/libs//jackson-module-parameter-names-2.9.6.jar
-rw-r--r--  0 0      0       26586  1  1  1970 app/libs//javax.annotation-api-1.3.2.jar
-rw-r--r--  0 0      0       66469  1  1  1970 app/libs//jboss-logging-3.3.2.Final.jar
-rw-r--r--  0 0      0        4596  1  1  1970 app/libs//jul-to-slf4j-1.7.25.jar
-rw-r--r--  0 0      0      255485  1  1  1970 app/libs//log4j-api-2.10.0.jar
-rw-r--r--  0 0      0       17519  1  1  1970 app/libs//log4j-to-slf4j-2.10.0.jar
-rw-r--r--  0 0      0      290339  1  1  1970 app/libs//logback-classic-1.2.3.jar
-rw-r--r--  0 0      0      471901  1  1  1970 app/libs//logback-core-1.2.3.jar
-rw-r--r--  0 0      0       41203  1  1  1970 app/libs//slf4j-api-1.7.25.jar
-rw-r--r--  0 0      0      297518  1  1  1970 app/libs//snakeyaml-1.19.jar
-rw-r--r--  0 0      0      366340  1  1  1970 app/libs//spring-aop-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0      660545  1  1  1970 app/libs//spring-beans-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0      930680  1  1  1970 app/libs//spring-boot-2.0.3.RELEASE.jar
-rw-r--r--  0 0      0     1162436  1  1  1970 app/libs//spring-boot-autoconfigure-2.0.3.RELEASE.jar
-rw-r--r--  0 0      0         592  1  1  1970 app/libs//spring-boot-starter-2.0.3.RELEASE.jar
-rw-r--r--  0 0      0         645  1  1  1970 app/libs//spring-boot-starter-json-2.0.3.RELEASE.jar
-rw-r--r--  0 0      0         613  1  1  1970 app/libs//spring-boot-starter-logging-2.0.3.RELEASE.jar
-rw-r--r--  0 0      0         591  1  1  1970 app/libs//spring-boot-starter-tomcat-2.0.3.RELEASE.jar
-rw-r--r--  0 0      0         588  1  1  1970 app/libs//spring-boot-starter-web-2.0.3.RELEASE.jar
-rw-r--r--  0 0      0     1090739  1  1  1970 app/libs//spring-context-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0     1226075  1  1  1970 app/libs//spring-core-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0      280032  1  1  1970 app/libs//spring-expression-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0       21703  1  1  1970 app/libs//spring-jcl-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0     1254656  1  1  1970 app/libs//spring-web-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0      789866  1  1  1970 app/libs//spring-webmvc-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0     3115994  1  1  1970 app/libs//tomcat-embed-core-8.5.31.jar
-rw-r--r--  0 0      0      240244  1  1  1970 app/libs//tomcat-embed-el-8.5.31.jar
-rw-r--r--  0 0      0      256776  1  1  1970 app/libs//tomcat-embed-websocket-8.5.31.jar
-rw-r--r--  0 0      0       93107  1  1  1970 app/libs//validation-api-2.0.1.Final.jar

Ermöglichen, dass bei jedem Build ein Container erstellt wird

Dies kann erreicht werden, indem die Gradle-Funktion mit dem Gradle-Plug-In verwendet und die Abhängigkeit für die Aufgabe angegeben wird.

Ändere die Version mit guild.gradle so, dass sie zu einem Alias wird.

version = '0.0.2-SNAPSHOT'

Bauen.

./gradlew build -x test
(Unterlassung)
Containerizing application to Docker daemon as jib-test:0.0.2-SNAPSHOT...

Getting base image gcr.io/distroless/java...
Building dependencies layer...
Building resources layer...
Building classes layer...
Finalizing...
Loading to Docker daemon...

Container entrypoint set to [java, -cp, /app/libs/*:/app/resources/:/app/classes/, com.example.jibtest.DemoApplication]

Built image to Docker daemon as jib-test:0.0.2-SNAPSHOT

Die Projekte bis zu diesem Punkt werden in GitHub als "Add-Gradle-Plugin" gespeichert.

Verwenden Sie ein lokales privates Repository

Versuchen wir den Teil, der den erstellten Container im Repository registriert.

Vorbereiten eines privaten Repositorys

Verwenden Sie den von Docker veröffentlichten Container für private Registrierung.

$ docker run -d -p 5000:5000 --restart always --name registry registry:2

Stellen Sie sicher, dass der private Repository-Container funktioniert.

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
8378d3fa853c        registry:2          "/entrypoint.sh /etc…"   2 minutes ago       Up 2 minutes        0.0.0.0:5000->5000/tcp   registry
Versuchen Sie, das Tag manuell zu verkaufen und in Ihr lokales Repository zu verschieben.

$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry 2 b2b03e9146e1 9 days ago 33.3MB graalvm latest 751a11aa3b93 3 weeks ago 985MB centos centos7 49f7960eb7e4 5 weeks ago 200MB jib-test 0.0.1-SNAPSHOT 2ce8c6f47c83 48 years ago 134MB jib-test 0.0.2-SNAPSHOT 2ce8c6f47c83 48 years ago 134MB

$ docker tag jib-test:0.0.1-SNAPSHOT localhost:5000/jib-test-0.0.1

$ docker push localhost:5000/jib-test-0.0.1 The push refers to repository [localhost:5000/jib-test-0.0.1] 2c5e48a8f567: Pushed 6ef8c795d7a5: Pushed 72bcd5740b92: Pushed 40930fb97dd9: Pushed 6189abe095d5: Pushed a9872a8d1d84: Pushed latest: digest: sha256:b61de386936e2a5726d91445c1af080c4a32762cd6745298f2872c0fb413b222 size: 1575 hirokis-MBP:jib-test hiroki$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry 2 b2b03e9146e1 9 days ago 33.3MB graalvm latest 751a11aa3b93 3 weeks ago 985MB centos centos7 49f7960eb7e4 5 weeks ago 200MB jib-test 0.0.1-SNAPSHOT 2ce8c6f47c83 48 years ago 134MB jib-test 0.0.2-SNAPSHOT 2ce8c6f47c83 48 years ago 134MB localhost:5000/jib-test-0.0.1 latest 2ce8c6f47c83 48 years ago 134MB

Ändern Sie die Docker-Daemon-Einstellungen

Aktivieren Sie mit dem Docker-Daemon den unsicheren Zugriff auf Ihre private Registrierung.

Klicken Sie unter macOS in der Menüleiste oben auf dem Bildschirm auf das Docker-Symbol und wählen Sie im Menü "Einstellungen" die Registerkarte "Daemon". Aktivieren Sie "Experimentelle Funktionen" und fügen Sie "localhost: 5000" zu unsicheren Registern hinzu. Klicken Sie auf "Übernehmen und neu starten" und warten Sie, bis der Docker-Dämon neu gestartet wird.

docker_option.png

(Ergänzung) Dieser Eintrag verwendet macOS, aber für Linux usw. [Around this] von StackOverflow (https://stackoverflow.com/questions/32808215/where-to-set-the-insecure-registry] -flag-on-mac-os) kann hilfreich sein.

Geben Sie Optionen an

Lesen Sie die [Gradle-Plugin-Seite] von Jib (https://github.com/GoogleContainerTools/jib/tree/master/jib-gradle-plugin#export-to-a-docker-context) und wählen Sie "allowInsecureRegistries" aus. Geben Sie die Parameter an. Der Standardwert ist false. Wenn Sie also die Jib-Task ohne Optionen ausführen, wird ein Fehler angezeigt. Setzen Sie den Parameter auf true, um die lokale Registrierung zu Testzwecken zu verwenden. _ Bitte beachten Sie, dass dies nur zu Testzwecken dient und keine Produktionseinstellung ist. _

jib {
  allowInsecureRegistries = true
}

Baue einen Container

Versuchen Sie, mit Gradles Fock-Aufgabe in Ihr lokales privates Repository zu wechseln.

warning: Base image 'gcr.io/distroless/java' does not use a specific image digest - build may not be reproducible

Containerizing application to localhost:5000/jib-test-0.0.2...

Retrieving registry credentials for localhost:5000...
Getting base image gcr.io/distroless/java...
Building dependencies layer...
Building resources layer...
Building classes layer...
Finalizing...

Container entrypoint set to [java, -cp, /app/libs/*:/app/resources/:/app/classes/, com.example.jibtest.DemoApplication]

Stellen Sie sicher, dass der Behälter aufbewahrt wird

Überprüfen Sie den Inhalt der privaten Registrierung mit dem Befehl curl. Enthält Jib-Test-0.0.2.

$ curl -X GET http://localhost:5000/v2/_catalog
{"repositories":["jib-test-0.0.1","jib-test-0.0.2"]}

Versuche dich zu bewegen

Verschieben wir den oben in der privaten Registrierung registrierten Container.

$ docker run -p 8080:8080 -it localhost:5000/jib-test-0.0.2 

Überprüfen Sie den Vorgang auf die gleiche Weise wie zuvor in diesem Eintrag.

$ curl http://localhost:8080/
Hello World!

Die Projekte bis zu diesem Punkt werden in GitHub als "Add-Gradle-Plugin" gespeichert.

Zusammenfassung

In diesem Eintrag haben wir gesehen, wie Java-Anwendungen mithilfe von Jib, einem Container oder Tool und dem Gradle-Plug-In von Jib einfach containerisiert werden können. Ich habe ein privates Repository gestartet und bestätigt, dass ich einen Container mit Gradles Jib-Befehl registrieren kann.

Zum Zeitpunkt des Schreibens dieses Eintrags befindet sich Jib in der Entwicklung, und es gibt einige Funktionen, die auf der Roadmap stehen, aber nicht realisiert sind, z. B. die Containerisierung von WAR-Dateien. Ob es angewendet werden kann oder nicht, hängt von den Umständen des Projekts ab, aber die Arbeit der Containerisierung ist Es scheint sinnvoll, die Anwendung in Betracht zu ziehen, da die Einfachheit Vorteile bietet.

Recommended Posts

Verwandeln Sie Java-Apps mit Jib ~ Build with gradle ganz einfach in Docker-Container und registrieren Sie sich im lokalen Repository
Verwandeln Sie Java-Anwendungen mit Jib ganz einfach in Docker
Erstellen und testen Sie Java + Gradle-Anwendungen mit Wercker
So erstellen Sie eine Docker-Umgebung mit Gradle for IntelliJ
[Definitive Edition 2018] [Java 11-Containerisierung] Nachdem Sie die Spring Boot-Anwendung bis zum Limit verkleinert haben, erstellen Sie sie mit Jib und senden Sie sie an ECR
[Java] [Maven] Vorlage von pom.xml zum Registrieren der JAR-Datei eines Drittanbieters im lokalen Repository
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
So erstellen Sie einen Jenkins-Server mit einem Docker-Container unter CentOS 7 von VirtualBox und greifen von einem lokalen PC auf den Jenkins-Server zu
Was ist in "Java 8 bis Java 11" passiert und wie wird eine Umgebung erstellt?
So entwickeln und registrieren Sie eine Sota-App in Java
Java: Starten Sie WAS mit Docker und stellen Sie Ihre eigene Anwendung bereit
Erstellen Sie DynamoDB local mit Docker
[Android] Konvertieren Sie Map in JSON mit GSON mit Kotlin und Java
Erstellen Sie mit Docker eine lokale Couchbase-Umgebung
Erstellen eines Java-Projekts mit Gradle
Erstellen Sie mit Docker CE für Windows eine Webanwendungsentwicklungsumgebung, die Java, MySQL und Redis verwendet
Hallo Welt in Java und Gradle
Erstellen Sie eine Debug-Umgebung auf einem Container. Erstellen Sie mit Docker eine lokale Entwicklungsumgebung für Rails-Tutorials.
Erstellen eines Projekts (und eines GitHub-Repositorys) mit Java und Gradle mit IntelliJ IDEA
Beginnen Sie mit der Installation von Docker auf EC2 und dem Ausführen von Yellowfin in einem Container
So migrieren Sie eine in einer lokalen Docker-Umgebung erstellte Webanwendung nach AWS
So starten Sie einen Docker-Container mit einem in einer Batchdatei bereitgestellten Volume
Lassen Sie uns eine TODO-Anwendung mit Java 2 erstellen. Ich möchte eine Vorlage mit Spring Initializr erstellen und eine Hello-Welt erstellen
Erstellen Sie mit Gradle ein Spring Boot + Docker-Image
CICS-Java-Anwendung ausführen- (3) Build-Management mit Gradle
Konvertieren Sie SVG-Dateien in Java in PNG-Dateien
Docker Container Build kann PHP-Radis nicht installieren
Von Java nach C und von C nach Java in Android Studio
Konvertieren Sie mit Ruby von JSON nach TSV und von TSV nach JSON
So erstellen Sie eine Rails 6-Umgebung mit Docker
Testen, erstellen und verschieben Sie Docker-Images mithilfe von GitHub-Aktionen in die GitHub-Container-Registrierung
Erstellen Sie mit Docker eine Apache- und Tomcat-Umgebung. Übrigens Maven & Java Kooperation
In dieser Zeit habe ich versucht, Java Bean und XML mit dem Jackson-Formatierer XML zu konvertieren