Utilisation de Docker depuis Java Gradle

Non limité à cette fois, allez-vous monter sur l'épaule du géant et rendre le forfait pratique? Dernière fois Commencez à partir de l'endroit où vous avez créé le package. Encore une fois, il y a Code source. Veuillez lire de temps en temps (README est dur, mais pardonnez-moi s'il vous plaît).

Plug-in d'introduction

Cette fois, nous utiliserons celui développé par Palantir Technologies (industrie de l'analyse de données) aux États-Unis. Ce sont des plugins docker. "Tachi" est dû au fait qu'il existe des plug-ins indépendants pour docker, docker-run et docker-compose. https://github.com/palantir/gradle-docker Je me demande si la composition est bonne cette fois ... Pour le moment, nous nous occuperons de tout, du gradle au démarrage du conteneur.

Chaque procédure

1. Créez Dockerfile

Eh bien, cela ne fonctionnera pas sans cela ... C'est ce que j'ai fait cette fois.

Dockerfile


FROM amazonlinux:latest

RUN yum update -y &&\
    yum upgrade -y &&\
    yum install java-11-amazon-corretto-headless -y

COPY ./build/libs/gradle-docker.jar /tmp/app.jar
ENTRYPOINT ["java", "-jar", "/tmp/app.jar"]

Je suppose qu'Amazon ECS / Fargate / EKS est un environnement cloud, il s'agit donc d'Amazon Linux (pensant abandonné). Si la taille de l'image est importante, ubuntu et alpin sont plus probables. Il n'y a rien que vous ne puissiez faire pour précipiter corretto dans les Alpes ... Je suis reconnaissant que Java soit 11 et que LTS puisse être utilisé gratuitement. Quoi qu'il en soit, commencez par commenter COPY et ENTRY POINT et vérifiez si cela fonctionne correctement.

2. Écrivez le démarrage du docker dans le script de construction

C'est un endroit difficile. Tout d'abord, remplissez le plug-in.

build.gradle


plugins {
  id 'java'
  id 'application'
  id 'idea'
  id 'eclipse'
  id 'com.palantir.docker' version '0.25.0'
  id 'com.palantir.docker-run' version '0.25.0'
}

Ensuite, nous ajouterons différentes options à la tâche: docker que possède le plug-in. Le téléchargement de copySpec est difficile à comprendre, donc je l'expliquerai plus tard.

build.gradle


docker {
  // name:Ce sera le nom de l'image du conteneur construit.
  //Le côté droit séparé par deux points est reconnu comme une balise.
  name "${project.name}:${project.version}"
  //Inutile de dire qu'il s'agit d'un Dockerfile.
  //Le chemin est.\Cela fonctionne avec ou sans lui.
  dockerfile file('Dockerfile')
  //Utilisez les spécifications de copie de Gradle pour amener les matériaux construits à la destination du plugin.
  copySpec.from('build/libs').into('build/libs')
  //utilisation du cache de construction du docker
  noCache true
  //Définition de la dépendance: après le docker gradle, la construction gradle s'exécute avant cela
  dependsOn tasks.build
}

Maintenant, si vous dites "gradle docker" sur la ligne de commande de base, il devrait s'exécuter.

Eh bien, puisque c'est un gros problème, voulez-vous aller démarrer le conteneur? Le plug-in est déjà inclus, il vous suffit donc d'ajouter des options de tâche. Étant donné que les options de démarrage du conteneur sont différentes pour chaque personne, Veuillez lire attentivement la Documentation.

build.gradle


dockerRun {
  //Le nom du conteneur.
  name project.name
  //Image pour démarrer(Le gars que j'ai fait avec la tâche de docker)
  image "${project.name}:${project.version}"
  //Démarrer le conteneur en tant que démon? : Exécution de Docker"-d" <-ce mec
  daemonize false  //Non, je manifeste
  //Êtes-vous un thon?(arrêter puis terminer automatiquement)
  clean true //C'est un thon.
}

Et maintenant, si vous appuyez sur la commande suivante, cela devrait l'être pour le moment.

$ ./gradlew docker
$ ./gradlew dockerRun
Hello World.

Cependant, il reste encore du travail à faire.

3.Faire un pot de graisse

Actuellement, il n'y a pas de bibliothèque donc ça marche bien, Lorsque je fouille dans la bibliothèque de cadres, cela échoue avec classNotFound. La seule façon de s'en débarrasser est de mettre le fichier jar de la bibliothèque dans le fichier jar à construire (mais pas facile). C'est également facile si vous utilisez un plugin. ShadowJar, utilisons ceci cette fois. Ajoutez d'abord un plug,

build.gradle


plugins {
  id 'java'
  id 'application'
  id 'idea'
  id 'eclipse'
  id 'com.palantir.docker' version '0.25.0'
  id 'com.palantir.docker-run' version '0.25.0'
  id 'com.github.johnrengelman.shadow' version '6.1.0' // <-ce mec
}

Ajoutez ensuite les options de tâche. Il dit finalisé par l'intérieur. Je ne vous l'ai pas dit lorsque j'ai ajouté la tâche docker, C'est un moyen explicite de passer à la tâche suivante une fois que cette tâche est correctement terminée. En d'autres termes, dans ce cas, vous souhaitez effectuer la tâche docker après avoir créé le fichier jar avec la tâche shadowJar. En ajoutant dependOn pour les tâches suivantes, il sera certainement exécuté avec shadowJar-> docker. Cependant, il n'y a aucune garantie que shadowJar se terminera avant l'exécution de la tâche docker. Pour être honnête, je suis un peu coincé ... dépendant de la tâche ...

build.gradle


shadowJar {
  //Comme il ne fait pas référence à la tâche jar, spécifiez également le fichier d'archive ici
  archiveFileName = "${project.name}.jar"
  //Dépendances
  finalizedBy tasks.docker
}

Et vous auriez dû pouvoir créer et démarrer l'image correctement avec la commande gradle docker / docker Run mentionnée ci-dessus.

Mouvement interne

Quant au plug-in docker, la clé est un fichier qui plonge dans l'image. Le plug-in stocke les matériaux (y compris Dockerfile) sous / build / docker, Je l'utilise pour la création d'images. Vous devez donc le faire dans les options de tâche du docker. Le plug-in utilise l'API "copySpec" de Gradle. Alors from /build/libs/* to /build/docker/build/libs/* Cela signifie que vous copiez le fichier de cette manière. Donc, le Dockerfile qui a également été copié sous build / docker J'ai trouvé ./build/libs/your.jar à partir de cet emplacement et copiez-le dans l'image. À propos, vous pouvez faire de même en combinant le fichier d'options du menu fixe de tâches et copySpec.

build.gradle


docker {
  name "${project.name}:${project.version}"
  dockerfile file('Dockerfile')
  files shadowJar.archiveFile.get()
  copySpec.into('build/libs')
  noCache true
  dependsOn tasks.shadowJar
}

En pré-remplissant l'option files, elle sera également répertoriée dans copySpec. Vous pouvez l'utiliser pour creuser dans l'image même si vous avez un autre fichier d'environnement que vous n'emballez pas dans le pot.

Si vous l'utilisez pour le développement

Cela peut être une prédication à Shaka, Nous vous recommandons de réécrire le Dockerfile pour le développement. Je construis une image avec le docker gradle à chaque fois, mais si je laisse tomber jdk et insuko, il se fanera. Créez une image qui a même créé un environnement java, Après cela, il est extrêmement rentable de commenter cette partie et de la diriger vers l'image qui a créé le FROM.

Dasoku

Cependant, ce groupe de plug-ins est génial, il y a beaucoup de choses à faire. Vous pouvez faire diverses choses telles que l'utilisation de l'image push et de la composition. J'ai toujours le sentiment que je suis ingénieur car il y a de telles choses et je peux les utiliser.

D'ailleurs, pour changer l'histoire, «monter sur les épaules d'un géant» n'est pas une métaphore, mais un géant. Il s'agit de SF. Turian est gentil.


De plus, comme c'est un peu gênant, je vais également créer un docker rmi avec la tâche gradle. Une chose que j'attends d'un plug-in est que je ne peux rien faire.

Recommended Posts

Utilisation de Docker depuis Java Gradle
Lancez Gradle depuis Ant
Utilisation de Docker depuis Java Gradle
Gradle
Exemple de code utilisant Minio de Java
Traitement des données à l'aide de l'API de flux de Java 8
Connectez-vous de Java à MySQL à l'aide d'Eclipse
Accédez à Forec.com depuis Java en utilisant Axis2 Enterprise WSDL
Rendre l'environnement SpringBoot1.5 + Gradle4.4 + Java8 + Docker compatible avec Java11
Construire Java x Spring x VSCode x Gradle sur Docker (1)
Essayez d'accéder à l'ensemble de données depuis Java en utilisant JZOS
En utilisant Gradle avec VSCode, compilez Java → exécutez
Connexion SSH à l'aide de SSHJ à partir de l'application Java 6
Tri à l'aide du comparateur java
Appeler Java depuis JRuby
Changements de Java 8 à Java 11
Somme de Java_1 à 100
Évaluer la source Java à partir de Java
Construction de premier niveau (Java)
Pratique de grattage avec Java ②
Accédez à API.AI depuis Java
Pratique du grattage avec Java ①
Prise en charge de Java 10 Docker
Lancez Gradle depuis Ant
Lancez Docker à partir de Java pour convertir des documents Office en PDF
Sortie de la valeur maximale d'un tableau à l'aide de la sortie standard Java
Créer un environnement VS Code + WSL + Java + Gradle à partir de zéro
[Java] Extraction de texte de PowerPoint (ppt) à l'aide d'Apache POI
Utilisation de la base de données (SQL Server 2014) à partir d'un programme Java 04/01/2018
[Note] Créez un environnement Java à partir de zéro avec docker
Essayez de créer un environnement de développement Java à l'aide de Docker
Surveiller le flux de journaux Azure AppService à partir du terminal (à l'aide de Docker)
Créer un multi-projet Java avec Gradle
Migration de Cobol vers JAVA
Spring + Gradle + Java Quick Start
[Gradle] À propos des tâches du plug-in Java
Essayez de gratter en utilisant Java [Note]
Essayez d'utiliser Cocoa de Ruby
Java à partir du débutant, remplacer
Création d'index Elastic Search à partir de Java
Nouvelles fonctionnalités de Java7 à Java8
Oracle Java 8 sur Docker Ubuntu
Paramètres Gradle pour l'utilisation de JUnit 5
Extraire des fichiers de Docker Image
Connectez-vous de Java à PostgreSQL
Java, instance à partir du débutant
Utilisation de Mapper avec Java (Spring)
Java à partir de débutant, héritage
La vie Java à partir de zéro
Essayez Hello World en utilisant Java brut sur le conteneur Docker
De Java inefficace à Java efficace
JavaScript vu de Java
Faire un diamant en utilisant Java
Construction de docker multi-projets à l'aide de jib
Tri des bulles à l'aide de ArrayList (JAVA)
Utilisation de PlantUml avec Honkit [Docker]
Exécuter des instructions non-Java à partir de Java
Exemple d'utilisation de l'API Bulk de Salesforce à partir d'un client Java avec PK-chunking
Essayez de transmettre des valeurs de Java Servlet à l'application iPhone à l'aide de JSON