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.
Die Middleware und die Bibliothek verwenden Folgendes.
Für folgende Leser:
Ab dem 16. Juli 2018 gab es den folgenden Eintrag auf Qiita mit dem Schlüsselwort Jib.
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 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'
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);
}
}
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!
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.
$ 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
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.
Versuchen wir den Teil, der den erstellten Container im Repository registriert.
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
$ 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
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.
(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.
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
}
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]
Ü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"]}
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.
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