Verwenden von Docker von Java Gradle

Möchten Sie nicht auf diese Zeit beschränkt auf der Schulter des Riesen reiten und das Paket bequemer machen? Letztes Mal Beginnen Sie an dem Ort, an dem Sie das Paket erstellt haben. Wieder gibt es Quellcode. Bitte lesen Sie von Zeit zu Zeit (README ist hart, aber bitte verzeihen Sie mir).

Einführungs-Plug-In

Dieses Mal werden wir die von Palantir Technologies (Datenanalyseindustrie) in den USA entwickelte verwenden. Dies sind Docker-Plugins. "Tachi" ist, weil es unabhängige Plug-Ins für Docker, Docker-Run und Docker-Compose gibt. https://github.com/palantir/gradle-docker Ich frage mich, ob das Komponieren diesmal gut ist ... Vorerst werden wir alles von Gradle bis zum Start des Containers erledigen.

Jedes Verfahren

1. Erstellen Sie eine Docker-Datei

Nun, ohne das geht es nicht ... Das habe ich diesmal gemacht.

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

Ich gehe davon aus, dass Amazon ECS / Fargate / EKS eine Cloud-Umgebung ist, also ist es Amazon Linux (Denken aufgegeben). Wenn die Bildgröße wichtig ist, sind Ubuntu und Alpin wahrscheinlicher. Es gibt nichts, was Sie nicht tun können, um Corretto in die Alpen zu stürzen ... Ich bin dankbar, dass Java 11 ist und LTS kostenlos verwendet werden kann. Wie auch immer, kommentieren Sie zuerst COPY und ENTRY POINT aus und überprüfen Sie, ob es richtig funktioniert.

2. Schreiben Sie den Docker-Start in das Build-Skript

Dies ist ein schwieriger Ort. Füllen Sie zuerst das Plug-In aus.

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

Anschließend fügen wir der Aufgabe verschiedene Optionen hinzu: Docker, über das das Plug-In verfügt. Der Download von copySpec ist schwer zu verstehen, daher werde ich ihn später erläutern.

build.gradle


docker {
  // name:Dies ist der Name des erstellten Container-Images.
  //Die durch einen Doppelpunkt getrennte rechte Seite wird als Tag erkannt.
  name "${project.name}:${project.version}"
  //Dies ist natürlich eine Docker-Datei.
  //Der Weg ist.\Es funktioniert mit oder ohne.
  dockerfile file('Dockerfile')
  //Verwenden Sie die Kopierspezifikationen von Gradle, um die erstellten Materialien zum Plugin-Ziel zu bringen.
  copySpec.from('build/libs').into('build/libs')
  //Docker Build Cache Nutzung aus
  noCache true
  //Abhängigkeitsdefinition: Nach dem Gradle Docker wird der Gradle Build zuvor ausgeführt
  dependsOn tasks.build
}

Wenn Sie nun in der grundlegenden Befehlszeile "gradle docker" sagen, sollte es ausgeführt werden.

Nun, da es eine große Sache ist, möchten Sie den Container starten? Das Plug-In ist bereits enthalten. Sie müssen also nur Aufgabenoptionen hinzufügen. Da die Startoptionen für Container für jede Person unterschiedlich sind, Bitte lesen Sie die Dokumentation sorgfältig durch.

build.gradle


dockerRun {
  //Der Containername.
  name project.name
  //Image zum Booten(Der Typ, den ich mit der Docker-Aufgabe gemacht habe)
  image "${project.name}:${project.version}"
  //Container als Daemon starten? : Docker ausführen"-d" <-dieser Typ
  daemonize false  //Nein, ich manifestiere
  //Bist du ein Thunfisch?(stoppen und dann automatisch beenden)
  clean true //Es ist ein Thunfisch.
}

Und jetzt, wenn Sie den folgenden Befehl drücken, sollte es vorerst sein.

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

Es gibt jedoch noch ein wenig zu tun.

3. Machen Sie fettes Glas

Derzeit gibt es keine Bibliothek, daher funktioniert es einwandfrei. Wenn ich in die Framework-Bibliothek stöbere, schlägt dies mit classNotFound fehl. Die einzige Möglichkeit, dies zu beseitigen, besteht darin, das Bibliotheksglas in die zu erstellende JAR-Datei zu setzen (obwohl dies nicht einfach ist). Dies ist auch einfach, wenn Sie Plugin verwenden. ShadowJar, verwenden wir diesmal. Fügen Sie zuerst einen Stecker hinzu,

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' // <-dieser Typ
}

Fügen Sie dann die Aufgabenoptionen hinzu. Es heißt finalisiert von innen. Ich habe dir das nicht gesagt, als ich die Docker-Aufgabe hinzugefügt habe. Es ist eine explizite Möglichkeit, mit der nächsten Aufgabe fortzufahren, nachdem diese Aufgabe ordnungsgemäß abgeschlossen wurde. Mit anderen Worten, in diesem Fall möchten Sie die Docker-Aufgabe ausführen, nachdem Sie das JAR mit der ShadowJar-Task erstellt haben. Durch Hinzufügen von deponOn für nachfolgende Aufgaben wird es sicherlich mit shadowJar-> docker ausgeführt. Es gibt jedoch keine Garantie dafür, dass shadowJar abgeschlossen wird, bevor die Docker-Task ausgeführt wird. Um ehrlich zu sein, stecke ich ein bisschen fest ... aufgabenabhängig ...

build.gradle


shadowJar {
  //Da es sich nicht um die JAR-Aufgabe handelt, geben Sie auch hier die Archivdatei an
  archiveFileName = "${project.name}.jar"
  //Abhängigkeiten
  finalizedBy tasks.docker
}

Und Sie sollten in der Lage sein, das Image mit dem oben genannten Befehl gradle docker / docker Run ordnungsgemäß zu erstellen und zu starten.

Interne Bewegung

Was das Docker-Plug-In betrifft, ist der Schlüssel eine Datei, die in das Bild eintaucht. Das Plug-In speichert Materialien (einschließlich Dockerfile) unter / build / docker. Ich benutze es für die Imageerstellung. Das müssen Sie also in den Docker-Task-Optionen tun. Das Plug-In verwendet Gradles "copySpec" -API. Damit from /build/libs/* to /build/docker/build/libs/* Dies bedeutet, dass Sie die Datei auf diese Weise kopieren. Also die Docker-Datei, die auch unter build / docker kopiert wurde Ich habe ./build/libs/your.jar von diesem Ort aus gefunden und in das Bild kopiert. Übrigens können Sie dasselbe tun, indem Sie die Task-Docker-Optionsdatei und copySpec kombinieren.

build.gradle


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

Wenn Sie die Dateioption vorab ausfüllen, wird sie auch in copySpec aufgeführt. Sie können dies verwenden, um in das Bild zu graben, selbst wenn Sie eine andere Umgebungsdatei haben, die Sie nicht in das Glas packen.

Wenn Sie es für die Entwicklung verwenden

Es kann eine Predigt zu Shaka sein, Wir empfehlen, das Dockerfile für die Entwicklung neu zu schreiben. Ich baue jedes Mal ein Bild mit Gradle Docker, aber wenn ich JDK und Insuko fallen lasse, wird es verdorren. Erstellen Sie ein Bild, das sogar eine Java-Umgebung erstellt hat. Danach ist es äußerst kostengünstig, diesen Teil zu kommentieren und auf das Bild zu richten, aus dem das FROM stammt.

Dasoku

Diese Gruppe von Plug-Ins ist jedoch fantastisch. Es gibt viele Dinge, die getan werden können. Sie können verschiedene Dinge tun, z. B. Image Push und Compose. Ich fühle mich immer als Ingenieur, weil es solche Dinge gibt und ich sie benutzen kann.

Um die Geschichte zu ändern, ist "auf den Schultern eines Riesen reiten" übrigens keine Metapher, sondern ein Riese. Es geht um SF. Turian ist nett.


Da es ein wenig mühsam ist, mache ich auch Docker-RMI mit der Gradle-Aufgabe. Eine Sache, die ich von einem Plug-In erwarte, ist, dass ich nichts tun kann.

Recommended Posts

Verwenden von Docker von Java Gradle
Starten Sie Gradle von Ant
Verwenden von Docker von Java Gradle
Gradle
Beispielcode mit Minio aus Java
Datenverarbeitung mit der Stream-API von Java 8
Stellen Sie mit Eclipse eine Verbindung von Java zu MySQL her
Greifen Sie über Java mit Axis2 Enterprise WSDL auf Forec.com zu
Machen Sie die SpringBoot1.5 + Gradle4.4 + Java8 + Docker-Umgebung mit Java11 kompatibel
Erstellen Sie Java x Spring x VSCode x Gradle auf Docker (1)
Versuchen Sie, mit JZOS von Java aus auf das Dataset zuzugreifen
Erstellen Sie mit Gradle mit VSCode Java → Ausführen
SSH-Verbindung mit SSHJ aus der Java6-App
Sortieren mit Java-Komparator
Rufen Sie Java von JRuby aus auf
Änderungen von Java 8 zu Java 11
Summe von Java_1 bis 100
Eval Java-Quelle von Java
Erster Gradle Build (Java)
Schrottpraxis mit Java ②
Greifen Sie über Java auf API.AI zu
Schrottpraxis mit Java ①
Java 10 Docker-Unterstützung
Starten Sie Gradle von Ant
Starten Sie Docker von Java aus, um Office-Dokumente in PDF zu konvertieren
Geben Sie den Maximalwert eines Arrays mithilfe der Java-Standardausgabe aus
Erstellen Sie die VS Code + WSL + Java + Gradle-Umgebung von Grund auf neu
[Java] Textextraktion aus PowerPoint (ppt) mit Apache POI
Verwenden der Datenbank (SQL Server 2014) aus einem Java-Programm 2018/01/04
[Hinweis] Erstellen Sie mit Docker eine Java-Umgebung von Grund auf neu
Versuchen Sie, mit Docker eine Java-Entwicklungsumgebung zu erstellen
Überwachen des Azure AppService-Protokolldatenstroms vom Terminal aus (mithilfe von Docker)
Erstellen Sie mit Gradle ein Java-Multiprojekt
Migration von Cobol nach JAVA
Spring + Gradle + Java Schnellstart
[Gradle] Informationen zu Java-Plug-In-Aufgaben
Versuchen Sie, mit Java zu kratzen [Hinweis]
Versuchen Sie es mit Cocoa von Ruby
Java ab Anfänger überschreiben
Elastic Search Indexerstellung aus Java
Neue Funktionen von Java7 bis Java8
Oracle Java 8 unter Docker Ubuntu
Gradle-Einstellungen für die Verwendung von JUnit 5
Extrahieren Sie Dateien aus Docker Image
Stellen Sie eine Verbindung von Java zu PostgreSQL her
Java, Instanz für Anfänger
Verwenden von Mapper mit Java (Spring)
Java ab Anfänger, Vererbung
Java-Leben von vorne anfangen
Versuchen Sie Hello World mit einfachem Java im Docker-Container
Von ineffektivem Java zu effektivem Java
JavaScript von Java aus gesehen
Machen Sie einen Diamanten mit Java
Docker-Build für mehrere Projekte mit Fock
Blasensortierung mit ArrayList (JAVA)
Verwenden von PlantUml mit Honkit [Docker]
Führen Sie Nicht-Java-Anweisungen von Java aus
Beispiel für die Verwendung der Bulk-API von Salesforce vom Java-Client mit PK-Chunking
Versuchen Sie, Werte von Java Servlet mit JSON an die iPhone-App zu übergeben