Docker ist mehr als nur das Starten eines Daemon-Prozesses. Es ist völlig schwierig, einen Stapel zu starten, der nur einmal ausgeführt wird.
Das Starten eines Containers mit dem Befehl "Docker" ist jedoch schmerzhaft. Verwenden Sie "Docker-Compose" auch für Stapel.
Dieses Mal möchte ich ein einfaches CLI-Programm ausführen, das als Stapel in Java geschrieben wurde.
https://github.com/knjname/2018-02_DockerComposeBatchExample
Sie können von hier herunterladen.
Ich habe es mit Spring Boot geschafft. Gehen Sie wie folgt vor: Es werden nur die Stapelargumente und Umgebungsvariablen gedruckt.
//So etwas wie die Hauptfunktion, wenn Sie CommandLineRunner mit Spring Boot beißen
@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"));
}
Es spielt keine Rolle, aber wenn Sie etwas erstellen möchten, das in Java keine Rolle spielt, verwenden Sie Spring Boot.
Dies ist der Inhalt, um die in der vorherigen Phase erstellte JAR ("... AS Builder") in den Container in der zweiten Hälfte zu importieren und die "Java-Jar JAR" auszuführen.
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" ]
Da das Ende ENTRYPOINT ist, können Sie Argumente an den Stapel übergeben.
Derzeit wird die Umgebungsvariable für den Stapel als "MY_ENV_VALUE" angegeben. Eigentlich denke ich, dass es das Verbindungsziel der Datenbank geben wird. Darüber hinaus wird hier auch das Exportverzeichnis der Batchdatei als Volume-Spezifikation angegeben.
docker-compose.yml
version: "3.4"
services:
batch:
#Docker erstellt den obigen Docker. -Bild, wenn mit t myjavabatch erstellt:Ich denke, es wird so etwas wie myjavabatch sein
build: ./
environment:
MY_ENV_VALUE: "foobarbaz"
# restart:Ich brauche nicht immer
# ports:Ich brauche nicht einmal
# network_mode: "host"Selbst wenn Sie angeben, sollte es im Gegensatz zu Dämonen kein Problem geben.
#Es ist besser, das Docker-Image nicht als Web zu verwenden, sondern nur ein Batch-Image zu erstellen.
Beginnen Sie wie immer nicht wie unten beschrieben. Dies startet den Dienst (Dämon).
$ docker-compose up -d
Ein Einwegbehälter, der gestartet wird, wenn Sie ihn wie eine Charge starten möchten, wird grundsätzlich mit "--rm" gestartet, wie unten gezeigt.
$ docker-compose run --rm Batch Batch Argumente
Übrigens, wenn Sie TTY oben nicht erreichen können (z. B. wenn Sie von crontab aus laufen), funktioniert es nicht. Geben wir -T
an.
$ docker-compose run --rm -T Batch-Batch-Argumente
Es gibt jedoch immer noch Fallen.
Derzeit (Stand 02/06/2018) nummeriert docker-compose run
die Containernamen nacheinander, z. B. base name_run_1
, aber _1
ist abgedeckt und kann nicht gestartet werden. Du darfst.
Benennen wir den Container explizit mit einer Zufallszahl, damit er nicht abgedeckt wird.
$ docker-compose run --rm -T --name `uuidgen`Batch Batch-Argumente
Dies ist perfekt.
uuidgen
.Erstellen wir auch eine Wrapper-Shell für den obigen Befehl.
wrapper.sh
#!/bin/bash
docker-compose run --rm -T --name `uuidgen` batch "$@"
Wenn Sie die Charge über die Trompetenschale aufrufen, ist sie perfekt. : smile_cat:
$ ./wrapper.sh my java batch is forever!!
Wenn Sie es regelmäßig mit cron ausführen möchten, verwenden Sie crontab -e
, um einen cron-Eintrag wie den folgenden zu definieren.
crontab
# /dev/Wirf es nicht auf null. Systemd für modernes Betriebssystem-Geben wir es der Katze.
0 * * * * cd /my/path/to/project && ./wrapper.sh my java batch is forever!!! 2>&1 | systemd-cat
Die Stapelausführung mit Docker-Compose ist nichts Besonderes. (Ich möchte glauben, dass es nicht so ist)
Let's challenge!!
Recommended Posts