Exécuter un lot avec docker-compose avec Java batch

Docker est plus que le simple lancement d'un processus démon. Il est totalement impossible de lancer un batch qui n'est exécuté qu'une seule fois.

Cependant, démarrer un conteneur avec la commande docker est pénible. Utilisez également docker-compose pour les lots.

Cette fois, je voudrais exécuter un simple programme CLI écrit en Java sous forme de lot.

La source

https://github.com/knjname/2018-02_DockerComposeBatchExample

Vous pouvez télécharger ici.

Introduction de la composition

Partie d'application Java

Je l'ai fait avec Spring Boot. Faites quelque chose comme ceci: Il imprime simplement les arguments de lot et les variables d'environnement.

    //Quelque chose comme la fonction principale lorsque vous mordez CommandLineRunner avec Spring Boot
    @Override
    public void run(String[] args) throws Exception {
		System.out.println("Batch run!!!");
		System.out.println("  args: " + String.join(", ", args));
		System.out.println("  env: " + System.getenv("MY_ENV_VALUE"));
    }

Cela n'a pas d'importance, mais si vous voulez créer quelque chose qui n'a pas d'importance en Java, utilisez Spring Boot.

Partie Dockerfile

C'est le contenu pour importer le JAR construit à l'étape précédente (... AS builder) dans le conteneur de la seconde moitié et exécuter le java -jar built JAR.

FROM library/openjdk:9.0.1-11-jre-slim AS builder
ADD . /app
WORKDIR /app
RUN ./gradlew bootRepackage
RUN mv /app/build/libs/*.jar /app.jar

FROM library/openjdk:9.0.1-11-jre-slim
COPY --from=builder /app.jar /app.jar
ENTRYPOINT [ "java", "-jar", "/app.jar" ]

Puisque la fin est ENTRYPOINT, vous pouvez passer des arguments au lot.

partie docker-compose.yml

Pour le moment, la variable d'environnement du lot est donnée comme «MY_ENV_VALUE». En fait, je pense que cela donnera la destination de connexion de la base de données. En outre, le répertoire d'exportation du fichier de commandes est également spécifié ici comme spécification de volume.

docker-compose.yml


version: "3.4"

services:

  batch:
    #Docker construit le Docker ci-dessus. -image une fois construite avec t myjavabatch:Je pense que ce sera quelque chose comme myjavabatch
    build: ./
    environment:
      MY_ENV_VALUE: "foobarbaz"

# restart:Je n'ai pas toujours besoin
# ports:Je n'ai même pas besoin
# network_mode: "host"Même si vous spécifiez, il ne devrait y avoir aucun problème contrairement aux démons.
#Il est préférable de ne pas utiliser l'image Docker comme Web, mais d'en créer une par lot.

Découvrez comment démarrer un lot

Comme toujours, ne commencez pas comme ci-dessous. Cela démarrera le service (démon).

$ docker-compose up -d

Fondamentalement, un conteneur jetable qui démarre lorsque vous souhaitez démarrer comme un lot est démarré avec --rm comme indiqué ci-dessous.

$ docker-compose run --arguments de lot rm batch

En passant, si vous ne pouvez pas obtenir TTY ci-dessus (comme exécuter à partir de crontab), cela ne fonctionnera pas. Spécifions -T.

$ docker-compose run --rm -Arguments de lot en T

Cependant, il existe encore des pièges.

Pour l'instant (à partir du 02/06/2018), docker-compose run numérote les noms de conteneurs dans l'ordre, comme base name_run_1, mais _1 est couvert et ne peut pas être démarré. Tu peux.

Nommons explicitement le conteneur avec un nombre aléatoire afin qu'il ne soit pas couvert.

$ docker-compose run --rm -T --name `uuidgen`batch Arguments de lots

C'est parfait.

Je veux aussi une coquille de trompette

Créons également un shell wrapper pour la commande ci-dessus.

wrapper.sh


#!/bin/bash

docker-compose run --rm -T --name `uuidgen` batch "$@"

Si vous appelez le lot via la trompette, c'est parfait. : smile_cat:

$ ./wrapper.sh my java batch is forever!!

Si vous voulez l'exécuter régulièrement avec cron, utilisez crontab -e pour définir une entrée cron comme celle ci-dessous.

crontab


# /dev/Ne le jetez pas à null. Systemd pour les OS modernes-Donnons-le au chat.
0 * * * * cd /my/path/to/project && ./wrapper.sh my java batch is forever!!! 2>&1 | systemd-cat

en conclusion

L'exécution par lots avec docker-compose n'a rien de spécial. (Je veux croire que ce n'est pas le cas)

Let's challenge!!

Recommended Posts

Exécuter un lot avec docker-compose avec Java batch
Exécuter Java VM avec Web Assembly
Exécuter des applications Java dans Azure Batch
Exécuter le fichier de commandes à partir de Java
Exécuter des applications écrites en Java8 en Java6
Développement Java avec Codenvy: Hello World! Run
Exécuter Rust depuis Java avec JNA (Java Native Access)
En utilisant Gradle avec VSCode, compilez Java → exécutez
S'entendre avec les conteneurs Java dans Cloud Run
Installez java avec Homebrew
Changer de siège avec Java
Installez Java avec Ansible
Exécutez PostgreSQL sur Java
Téléchargement confortable avec JAVA
Changer java avec direnv
Démarrez k3s avec docker-compose
Exécutez Payara avec Docker
Téléchargement Java avec Ansible
Raclons avec Java! !!
Construire Java avec Wercker
Conversion Endian avec JAVA
Soumettre une tâche à AWS Batch avec Java (Eclipse)
[Tutoriel] Télécharger Eclipse → Lancer l'application avec Java (Pléiades)
[Tutoriel] Télécharger Eclipse → Lancer l'application Web avec Java (Pléiades)
Java EE sans serveur à partir de Quarkus et Cloud Run
(Java) BDD facile avec Spectrum?
Utiliser des couches Lambda avec Java
Créer un multi-projet Java avec Gradle
Configuration Java avec Spring MVC
Expérimentons l'expansion en ligne Java
[Template] Connexion MySQL avec Java
Réécrire Java try-catch avec facultatif
Installez Java 7 avec Homebrew (cask)
[Java] Communication JSON avec jackson
Exécutez TAO Core avec Docker
Java pour jouer avec Function
Essayez la connexion DB avec Java
Activer Java EE avec NetBeans 9
[Java] JavaConfig avec classe interne statique
Essayez gRPC avec Java, Maven
Exploitons Excel avec Java! !!
Gestion des versions Java avec SDKMAN
Exécutez Tensorflow avec THETA V
Exécutez LIFF avec Spring Boot
Cryptage / décryptage RSA avec Java 8
Pagination de PDF avec Java + PDFBox.jar
Trier les chaînes comme une fonction caractéristique avec Java
Orienté objet avec Strike Gundam (java)
Exécuter l'analyse avec OpenJDK11 Java Flight Recorder + Google Kubernetes Engine
java bonjour le monde, compilez, exécutez
Exécuter des rails à chaque fois dans le docker
[Java] Acquisition de contenu avec HttpCliient
Gestion des versions Java avec jenv
Dépannage avec Java Flight Recorder
Rationalisez les tests Java avec Spock
Connectez-vous à DB avec Java
Exécutez l'applet java sur ubuntu
Connectez-vous à MySQL 8 avec Java
Erreur lors de la lecture avec java
Utilisation de Mapper avec Java (Spring)