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).
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.
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.
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.
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.
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.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.
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.
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