[JAVA] Erstellen Sie mit Gradle ein Spring Boot + Docker-Image

TL;DR

--Versuchen Sie, ein Docker-Image mit Gradle zu erstellen

Aufbau der Ausführungsumgebung

Umgebung

Die folgenden Überprüfungselemente werden unter macOS ausgeführt Die verwendete Version der Bibliothek usw. lautet wie folgt

Erstellen Sie ein Projekt

Wählen Sie ein Projekt mit SPRING INITIALIZR.

Versuchen Sie, das Web in Abhängigkeiten einzubeziehen, indem Sie mit Gradle als "Gradle-Projekt erstellen" erstellen.

screenshot_spring_init.png

Extrahieren Sie die fertige "demo.zip", erstellen Sie das Projekt und führen Sie es mit gradle aus

$ unzip demo.jar
$ cd demo
$ ./gradlew build
$ java -jar build/libs/demo-0.0.1-SNAPSHOT.jar
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.8.RELEASE)

2017-11-10 10:04:09.107  INFO 41308 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication on mac0137.local.furyu.jp with PID 41308 (/Users/moriokanaoki/Downloads/demo/build/libs/demo-0.0.1-SNAPSHOT.jar started by moriokanaoki in /Users/moriokanaoki/Downloads/demo)
2017-11-10 10:04:09.111  INFO 41308 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default profiles: default
2017-11-10 10:04:09.193  INFO 41308 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@45283ce2: startup date [Fri Nov 10 10:04:09 JST 2017]; root of context hierarchy
2017-11-10 10:04:10.577  INFO 41308 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2017-11-10 10:04:10.591  INFO 41308 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2017-11-10 10:04:10.592  INFO 41308 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.23
2017-11-10 10:04:10.676  INFO 41308 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2017-11-10 10:04:10.676  INFO 41308 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1486 ms
2017-11-10 10:04:10.804  INFO 41308 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2017-11-10 10:04:10.809  INFO 41308 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-11-10 10:04:10.810  INFO 41308 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-11-10 10:04:10.810  INFO 41308 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-11-10 10:04:10.810  INFO 41308 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2017-11-10 10:04:11.191  INFO 41308 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@45283ce2: startup date [Fri Nov 10 10:04:09 JST 2017]; root of context hierarchy
2017-11-10 10:04:11.299  INFO 41308 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2017-11-10 10:04:11.300  INFO 41308 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2017-11-10 10:04:11.332  INFO 41308 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-11-10 10:04:11.333  INFO 41308 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-11-10 10:04:11.372  INFO 41308 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-11-10 10:04:11.509  INFO 41308 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2017-11-10 10:04:11.578  INFO 41308 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-11-10 10:04:11.583  INFO 41308 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 2.98 seconds (JVM running for 3.412)

Es funktioniert, aber es ist schwer zu verstehen, also werde ich versuchen, über Hello World auszugeben.

src/main/java/com/example/demo/DemoApplication.java


package com.example.demo;

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

@SpringBootApplication
@RestController
public class DemoApplication {

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

        @RequestMapping(value = "/")
        String sayHello() {
                return "Hello World!";
        }
}

Wenn Sie demo.jar erneut starten und auf Port 8080 von localhost zugreifen, sollte" Hello World! "Angezeigt werden.

Bereiten Sie eine Docker-Datei vor

Bereiten Sie eine Docker-Datei direkt unter dem Projekt vor, um ein Docker-Image zu erstellen, das das obige "Java-Jar" ausführt. Die Erstellung von demo.jar usw. ist mit der später beschriebenen Änderung von build.gradle verknüpft

Dockerfile


FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/demo.jar app.jar
ENV JAVA_OPTS=""
ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar

Gradle-Docker-Plugin hinzugefügt

Ändern Sie build.gradle, um ein Docker-Image in Gradle zu generieren.

build.gradle


buildscript {
	ext {
		springBootVersion = '1.5.8.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
		classpath "se.transmode.gradle:gradle-docker:1.2"
	}
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'docker'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
	mavenCentral()
}

dependencies {
	compile('org.springframework.boot:spring-boot-starter-web')
	testCompile('org.springframework.boot:spring-boot-starter-test')
}

jar {
    baseName = 'demo'
    archiveName = "${baseName}.jar"
}

task buildDocker(type: Docker, dependsOn: build) {
    applicationName = jar.baseName
    dockerfile = file('Dockerfile')
    doFirst {
        copy {
            from jar
            into "${stageDir}/target"
        }
    }
}

Bauen

Lassen Sie es uns gleich bauen. Vergessen Sie nicht, "Docker hier unter MacOS laufen zu lassen"

$ ./gradlew build buildDocker
Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details
:compileJava
:processResources UP-TO-DATE
:classes
:findMainClass
:jar
:bootRepackage
:assemble
:compileTestJava
:processTestResources NO-SOURCE
:testClasses
:test
2017-11-10 22:27:45.286  INFO 43631 --- [       Thread-5] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@697f2062: startup date [Fri Nov 10 22:27:43 JST 2017]; root of context hierarchy
:check
:build
:buildDocker
Sending build context to Docker daemon   14.5MB
Step 1/5 : FROM openjdk:8-jdk-alpine
 ---> xxxxxxxxxxxx
Step 2/5 : VOLUME /tmp
 ---> Using cache
 ---> xxxxxxxxxxxx
Step 3/5 : ADD target/demo.jar app.jar
 ---> xxxxxxxxxxxx
Removing intermediate container xxxxxxxxxxxx
Step 4/5 : ENV JAVA_OPTS ""
 ---> Running in xxxxxxxxxxxx
 ---> xxxxxxxxxxxx
Removing intermediate container xxxxxxxxxxxx
Step 5/5 : ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar
 ---> Running in xxxxxxxxxxxx
 ---> xxxxxxxxxxx
Removing intermediate container xxxxxxxxxxxx
Successfully built xxxxxxxxxxxx
Successfully tagged com.example/demo:0.0.1-SNAPSHOT

BUILD SUCCESSFUL

$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
com.example/demo                0.0.1-SNAPSHOT      xxxxxxxxxxxx        1 minutes ago       116MB

Es scheint, dass es erfolgreich abgeschlossen wurde

Starten von Spring Boot mit Docker

$ docker run -p 8080:8080 -d com.example/demo:0.0.1-SNAPSHOT
xxxxxxxxxxxxxxxcf54172bd224611a7a184d3d454ee06a289143c191041706
$ docker ps
CONTAINER ID        IMAGE                             COMMAND                  CREATED             STATUS              PORTS                    NAMES
xxxxxxxxxxxx        com.example/demo:0.0.1-SNAPSHOT   "/bin/sh -c 'exec ..."   36 seconds ago      Up 10 seconds       0.0.0.0:8080->8080/tcp   friendly_murdock

Es scheint zu laufen. Wenn ich auf Port 8080 von localhost zugreife, wird erneut "Hello World!" Angezeigt.

Zusammenfassung

Diesmal habe ich den Bildnamen oder das Tag nicht angepasst. Außerdem wurde das Docker-Image lose lokal bereitgestellt.

Ich konnte ein Docker-Image genauso erstellen wie eine JAR-Datei mit Gradle Da die Einführung von Java 9 und Open JDK voraussichtlich in Zukunft Fortschritte machen wird, scheint Docker in Zukunft die erste Wahl für die Ausführung von Spring Boot zu sein.

Verweise

Recommended Posts

Erstellen Sie mit Gradle ein Spring Boot + Docker-Image
Spring Boot 2 Multiprojekt mit Gradle
Implementieren Sie die Spring Boot-Anwendung in Gradle
So verkleinern Sie das Spring Boot Docker-Image
Erstellen Sie Java x Spring x VSCode x Gradle auf Docker (1)
Erstellen Sie mit Gradle Spring Boot-Projekte nach Umgebung
Java-Tipps - Erstellen Sie mit Gradle ein Spring Boot-Projekt
Zeigen Sie die Gradle-Aufgabe im Spring Boot-Projekt an
Installieren Sie das Garn im Docker-Image
Spring Boot beginnend mit Docker
Aufbau der Docker x Spring Boot-Umgebung
Wichtige Änderungen in Spring Boot 1.5
NoHttpResponseException in Spring Boot + WireMock
Erstellen einer Datenbankumgebung mit Docker in Spring Boot (IntellJ)
Frühlingsstiefel Hallo Welt in Eclipse
Spring Boot-Anwendungsentwicklung in Eclipse
◆ Konstruktionsnotiz für Spring Boot + Gradle-Umgebung
Schreiben Sie den Testcode mit Spring Boot
Implementieren Sie die REST-API mit Spring Boot
Was ist @Autowired im Spring Boot?
Verwendung von Thymeleaf mit Spring Boot
[Splunk] Erstellen von Splunk Enterprise (mit Docker-Image)
Frühling × Docker
Stellen Sie sich die Spring Boot-App mit dem Jib-Maven-Plugin vor und starten Sie sie mit Docker
Starten Sie mit IntelliJ ein (altes) Spring Boot-Projekt
Statische Dateizugriffspriorität beim Spring Boot
Spring Boot-Protokoll im JSON-Format ausgeben
Memorandum zum Herunterladen lokaler Dateien mit Spring Boot
Erstellen Sie mit IntelliJ ein Java Spring Boot-Projekt
Lösen Sie die Thymeleaf-Syntaxprüfung in Spring Boot
[Trainieren! ] Zeigen Sie Hello World mit Spring Boot an
Aufbau der Spring Boot + Docker Java-Entwicklungsumgebung
Verwenden Sie die DynamoDB-Abfragemethode mit Spring Boot
[Docker] Starten Sie den Container, starten Sie die Bash im Container und löschen Sie das Bild
Zusammenfassung der Grundeinstellungen für Spring Boot, Doma2, Gradle
DI SessionScope Bean im Spring Boot 2-Filter
(IntelliJ + gradle) Hallo Welt mit Spring Boot
Fügen Sie Frühlingsstiefel und Gradle zur Sonnenfinsternis hinzu
Ändern Sie das Sitzungszeitlimit in Spring Boot
Erstellen Sie eine Website mit Spring Boot + Gradle (jdk1.8.x)
SameSite-Cookie im Spring Boot (Spring Web MVC + Tomcat)
Testen Sie den Controller mit Mock MVC im Spring Boot
Asynchrone Verarbeitung mit regelmäßiger Ausführung in Spring Boot
Führen Sie die Scala-Anwendung mit Spring Boot über Gradle aus
Anforderungs- und Antwortprotokolle mit Spring Boot ausgeben
Fordern Sie Spring Boot heraus
Servlet-Filter mit Spring Boot verwenden [Spring Boot 1.x, 2.x kompatibel]
So fügen Sie in Spring Boot einen Klassenpfad hinzu
Spring Boot Form
So binden Sie mit einer Eigenschaftendatei in Spring Boot
Ich wollte Spring Boot in einem Multiprojekt gradle
Spring Boot Denken Sie daran
gae + frühlingsstiefel
Anmerkungen, die in Spring Boot-Aufgabenverwaltungstools verwendet werden
Erstellen Sie mit Docker eine Spring Boot-Entwicklungsumgebung
Aufbau einer Java-Entwicklungsumgebung (Mac + Plejaden All in One Eclipse 4.7 + Spring Boot + Gradle (Buildship))
Cache Gradle-abhängige Dateien, um die Docker-Erstellung zu beschleunigen
Geben Sie die statische Ressourcencodierung in Spring Boot an