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.
https://github.com/knjname/2018-02_DockerComposeBatchExample
Vous pouvez télécharger ici.
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.
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.
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.
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.
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
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