Erstellen eines Containerimages aus einer JAR- oder WAR-Datei
Hinweis
Die Pläne Basic, Standard und Enterprise gelten ab Mitte März 2025 als veraltet und werden über einen Zeitraum von drei Jahren eingestellt. Es wird empfohlen, auf Azure Container Apps umzustellen. Weitere Informationen finden Sie in der Ankündigung zur Einstellung von Azure Spring Apps.
Der Plan Standardverbrauch und dediziert gilt ab dem 30. September 2024 als veraltet und wird nach sechs Monaten vollständig eingestellt. Es wird empfohlen, auf Azure Container Apps umzustellen. Weitere Informationen finden Sie unter Migrieren des Plans „Standardverbrauch und dediziert“ von Azure Spring Apps zu Azure Container Apps.
Dieser Artikel gilt für:✅ Basic/Standard ✅ Enterprise
Dieser Artikel enthält Anleitungen zum Verpacken Ihrer Java-Anwendung aus einer JAR- oder WAR-Datei in ein Containerimage.
Mit dem Azure Spring Apps Standardplan können Sie eine JAR- oder WAR-Datei hochladen, die sie automatisch in ein verwaltetes Containerimage verpackt. In ähnlicher Weise unterstützen Azure Container Apps und Azure Kubernetes Service (AKS) auch die Bereitstellung einer Container-App direkt aus einer JAR- oder WAR-Datei.
Voraussetzungen
- Docker
- Eine bestehende Containerregistrierung zum Speichern von Containerimages. Bei Azure Container Registry können Sie dies über das Azure-Portal oder über die Azure CLI einrichten.
Erstellen eines Containerimages
Wenn Sie ein Containerimage erstellen möchten, das mit dem in Azure Spring Apps verwendeten konsistent ist, können Sie das Image selbst erstellen. Um eine JAR-Datei, WAR-Datei oder einen Java-Quellcode in ein Containerimage zu erstellen, gehen Sie wie folgt vor:
- Erstellen Sie Ihren Java-Quellcode in einer JAR-Datei oder einer WAR-Datei.
- Erstellen Sie eine Dockerfile und führen Sie die folgenden Aktionen aus:
- (Nur für WAR-Dateien) Laden Sie Tomcat herunter und konfigurieren Sie es.
- Kopieren Sie Ihre JAR-Datei oder WAR-Datei in das Containerimage.
- Geben Sie den Einstiegspunkt des Containerimages an.
- Erstellen Sie ein Containerimage, indem Sie den Befehl
docker build
mit der im vorherigen Schritt erstellten Dockerfile ausführen. - Pushen Sie das Containerimage in eine öffentliche oder private Container-Registry, damit Sie es später in einer Azure Container Apps-Umgebung oder einem Azure Kubernetes Service (AKS)-Cluster einsetzen können.
In den folgenden Abschnitten werden diese Schritte ausführlicher beschrieben.
Erstellen einer JAR-Datei
Wir empfehlen die Verwendung von Containerimages für den Microsoft Build von OpenJDK, wenn Ihre Anwendung reibungslos auf Azure Spring Apps ausgeführt wird. Wenn sich Ihre Anforderungen ändern, können Sie andere Containerimages auswählen, die Ihren Anforderungen besser entsprechen.
Um die in Ihrer Bereitstellung verwendete JDK-Version zu ermitteln, die in Azure Spring Apps ausgeführt wird, verwenden Sie den folgenden Befehl:
az spring app deployment show \
--app <app-name> \
--name <deployment-name> \
--resource-group <resource-group> \
--service <service-name> \
--query properties.source.runtimeVersion
Die Dockerfile im folgenden Beispiel basiert auf JDK 17:
# filename: JAR.dockerfile
FROM mcr.microsoft.com/openjdk/jdk:17-mariner
ARG JAR_FILENAME
COPY $JAR_FILENAME /opt/app/app.jar
ENTRYPOINT ["java", "-jar", "/opt/app/app.jar"]
Verwenden Sie zum Erstellen des Containerimages mit dieser Dockerfile den folgenden Befehl:
docker build -t <image-name>:<image-tag> \
-f JAR.dockerfile \
--build-arg JAR_FILENAME=<path-to-jar> \
.
Informationen zum Anpassen von JVM-Optionen finden Sie unter JVM-Optionen.
Erstellen einer WAR-Datei
Vor dem Erstellen einer WAR-Datei müssen Sie entscheiden, welche Versionen von JDK und Tomcat verwendet werden sollen.
Um die in Ihrer Bereitstellung verwendete Tomcat-Version zu ermitteln, die in Azure Spring Apps ausgeführt wird, verwenden Sie den folgenden Befehl:
az spring app deployment show \
--app <app-name> \
--name <deployment-name> \
--resource-group <resource-group> \
--service <service-name> \
--query properties.source.serverVersion
Das folgende Beispiel zeigt eine Dockerfile-Datei, die auf JDK 17 basiert:
# filename: WAR.dockerfile
FROM mcr.microsoft.com/openjdk/jdk:17-mariner
ARG TOMCAT_VERSION
ARG TOMCAT_MAJOR_VERSION
ARG WAR_FILENAME
ARG TOMCAT_HOME=/opt/tomcat
# Set up Tomcat
ADD https://archive.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR_VERSION/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz \
$TOMCAT_HOME/apache-tomcat-$TOMCAT_VERSION.tar.gz
RUN tdnf update -y \
&& tdnf install -y tar \
&& tar -zxf $TOMCAT_HOME/apache-tomcat-$TOMCAT_VERSION.tar.gz -C $TOMCAT_HOME --strip-components 1 \
&& rm $TOMCAT_HOME/apache-tomcat-$TOMCAT_VERSION.tar.gz \
&& rm -r $TOMCAT_HOME/webapps/*
COPY $WAR_FILENAME $TOMCAT_HOME/webapps/app.war
ENTRYPOINT ["/bin/sh", "-c" , "/opt/tomcat/bin/catalina.sh run"]
Verwenden Sie zum Erstellen des Containerimages mit dieser Dockerfile den folgenden Befehl:
docker build -t <image-name>:<image-tag> \
-f WAR.dockerfile \
--build-arg WAR_FILENAME=<path-to-war> \
--build-arg TOMCAT_VERSION=<version> \
--build-arg TOMCAT_MAJOR_VERSION=<major-version> \
.
Mehrstufige Builds
Die beiden zuvor erwähnten Ansätze sind reine Paket-Builds. Sie verlassen sich auf Ihr lokales Buildtool, um den Buildprozess zu verwalten und das Ergebnis in eine JAR- oder WAR-Datei zu packen.
Wenn Sie es vorziehen, kein Build-Tool oder JDK auf dem Hostcomputer zu installieren, aber konsistente Ergebnisse auf verschiedenen Rechnern wünschen, können Sie eine alternative Methode verwenden, indem Sie mehrere Build-Stufen in einer Dockerfile definieren. Eine Stufe ist der Kompilierung und Verpackung gewidmet, während eine andere Stufe den Prozess der Image-Erstellung übernimmt. Weitere Informationen finden Sie unter Mehrstufige Builds.
Azure Container Registry Tasks
Wenn Sie über eine Azure Container Registry-Instanz verfügen, können Sie ein Containerimage mithilfe von Azure Container Registry Tasks erstellen, pushen und ausführen. Weitere Informationen finden Sie unter Schnellstart: Erstellen und Ausführen eines Containerimages mithilfe von Azure Container Registry Tasks.