[JAVA] Créer une image Spring Boot + Docker avec Gradle

TL;DR

Construction de l'environnement d'exécution

environnement

Les éléments de vérification suivants sont effectués sur macOS La version de la bibliothèque etc. utilisée est la suivante

Créer un projet

Sélectionnez un projet à l'aide de SPRING INITIALIZR

Essayez d'inclure le Web dans les dépendances en créant avec Gradle comme Générer un «projet Gradle»

screenshot_spring_init.png

Extrayez le demo.zip terminé, construisez et exécutez le projet avec gradle

$ 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)

Cela fonctionne, mais c'est difficile à comprendre, donc je vais essayer de sortir sur Hello World.

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!";
        }
}

Si vous redémarrez demo.jar et accédez au port 8080 de localhost, vous devriez voir" Hello World! ".

Préparer un Dockerfile

Préparez un Dockerfile directement sous le projet pour créer une image Docker qui exécute le java -jar ci-dessus. La création de demo.jar etc. est liée au changement de build.gradle décrit plus loin

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

Ajout du plugin gradle-docker

Modifiez build.gradle pour générer une image Docker dans Gradle.

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"
        }
    }
}

Construire

Construisons-le tout de suite. N'oubliez pas de continuer à exécuter Docker sur macOS ici

$ ./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

Il semble qu'il a été terminé avec succès

Lancement de Spring Boot avec 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

Il semble fonctionner. Lorsque j'accède au port 8080 de localhost, "Hello World!" S'affiche à nouveau.

Résumé

Je n'ai pas ajusté le nom ou la balise de l'image cette fois. En outre, l'image Docker a été déployée localement de manière lâche.

J'ai pu créer une image Docker de la même manière que créer un fichier jar avec Gradle Étant donné que l'adoption de Java 9 et d'Open JDK devrait progresser à l'avenir, il se peut qu'il y ait un avenir où Docker semble être le premier choix pour exécuter Spring Boot.

Les références

Recommended Posts

Créer une image Spring Boot + Docker avec Gradle
Multi-projets Spring Boot 2 avec Gradle
Implémenter l'application Spring Boot dans Gradle
Comment réduire l'image de Spring Boot Docker
Construire Java x Spring x VSCode x Gradle sur Docker (1)
Créez des projets Spring Boot par environnement avec Gradle
Conseils Java - Créez un projet Spring Boot avec Gradle
Afficher la tâche Gradle dans le projet Spring Boot
Installer du fil dans l'image du docker
Spring Boot à partir de Docker
Construction de l'environnement Docker × Spring Boot
Changements majeurs dans Spring Boot 1.5
NoHttpResponseException dans Spring Boot + WireMock
Création d'un environnement de base de données avec Docker dans Spring Boot (IntellJ)
Spring Boot Hello World dans Eclipse
Développement d'applications Spring Boot dans Eclipse
◆ Spring Boot + note de construction de l'environnement gradle
Écrire du code de test avec Spring Boot
Implémenter l'API REST avec Spring Boot
Qu'est-ce que @Autowired dans Spring Boot?
Comment utiliser Thymeleaf avec Spring Boot
[Splunk] Création de Splunk Enterprise (à l'aide de l'image Docker)
printemps × docker
Image de l'application Spring Boot à l'aide de jib-maven-plugin et lancez-la avec Docker
Lancer un (ancien) projet Spring Boot avec IntelliJ
Priorité d'accès aux fichiers statiques dans Spring Boot
Sortie du journal Spring Boot au format json
Mémorandum de téléchargement de fichier local avec Spring Boot
Créer un projet Java Spring Boot avec IntelliJ
Desserrer la vérification de la syntaxe de Thymeleaf dans Spring Boot
[Entraine toi! ] Affichez Hello World avec Spring Boot
Construction de l'environnement de développement Java Spring Boot + Docker
Utiliser la méthode de requête DynamoDB avec Spring Boot
[Docker] Démarrez le conteneur, démarrez bash à l'intérieur du conteneur, supprimez l'image
Résumé des paramètres initiaux pour Spring Boot, Doma2, Gradle
DI SessionScope Bean dans le filtre Spring Boot 2
(IntelliJ + gradle) Hello World avec Spring Boot
Ajoutez une botte de printemps et un dégradé à éclipse
Modifier le délai d'expiration de la session dans Spring Boot
Créez un site Web avec Spring Boot + Gradle (jdk1.8.x)
Cookie SameSite dans Spring Boot (Spring Web MVC + Tomcat)
Testez le contrôleur avec Mock MVC dans Spring Boot
Traitement asynchrone avec exécution régulière dans Spring Boot
Exécutez l'application Scala avec Spring Boot via Gradle
Sortie des journaux de demande et de réponse avec Spring Boot
Défi Spring Boot
Utiliser le filtre de servlet avec Spring Boot [compatible Spring Boot 1.x, 2.x]
Comment ajouter un chemin de classe dans Spring Boot
Forme de botte de printemps
Comment se lier avec un fichier de propriétés dans Spring Boot
Je voulais classer la botte à ressort dans un multi-projet
Spring Boot Rappelez-vous
gae + botte à ressort
Annotations utilisées dans les outils de gestion des tâches Spring Boot
Créer un environnement de développement Spring Boot avec docker
Construction de l'environnement de développement Java (Mac + Pleiades All in One Eclipse 4.7 + Spring Boot + Gradle (Buildship))
Cachez les fichiers dépendants de Gradle pour accélérer la construction du docker
Spécifiez le codage des ressources statiques dans Spring Boot