你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
从 JAR 或 WAR 生成容器映像
注意
基本、标准和企业计划将从 2025 年 3 月中旬开始弃用,停用期为 3 年。 建议转换到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告。
标准消耗和专用计划将于 2024 年 9 月 30 日开始弃用,并在六个月后完全关闭。 建议转换到 Azure 容器应用。 有关详细信息,请参阅将 Azure Spring Apps 标准消耗和专用计划迁移到 Azure 容器应用。
本文适用于:✅基本计划/标准计划 ✅ 企业计划
本文介绍如何将 Java 应用程序从 JAR 或 WAR 文件打包到容器映像中。
使用 Azure Spring Apps 标准计划,可以上传 JAR 或 WAR 文件,该文件会自动打包到托管容器映像中。 同样,Azure 容器应用和 Azure Kubernetes 服务 (AKS) 也支持直接从 JAR 或 WAR 文件部署容器应用。
先决条件
生成容器映像
如果要创建与 Azure Spring Apps 中使用的容器映像一致的容器映像,可以自行生成映像。 若要将 JAR 文件、WAR 文件或 Java 源代码生成到容器映像中,请使用以下常规步骤:
- 将 Java 源代码生成到 JAR 文件或 WAR 文件中。
- 创建 Dockerfile 并执行以下操作:
- (仅适用于 WAR 文件)下载 Tomcat 并对其进行配置。
- 将 JAR 文件或 WAR 文件复制到容器映像中。
- 指定容器映像的入口点。
- 使用在上一步中创建的 Dockerfile 运行
docker build
命令来创建容器映像。 - 将容器映像推送到公共或专用容器注册表,以便稍后可以在 Azure 容器应用环境或 Azure Kubernetes 服务 (AKS) 群集中对其进行部署。
以下各部分更详细地说明了这些步骤。
生成 JAR 文件
如果应用程序在 Azure Spring Apps 上顺利运行,建议将容器映像用于 OpenJDK 的 Microsoft 生成。 如果你的要求发生了更改,可以选择其他更符合需求的容器映像。
若要确定在 Azure Spring Apps 中运行的部署中使用的 JDK 版本,请使用以下命令:
az spring app deployment show \
--app <app-name> \
--name <deployment-name> \
--resource-group <resource-group> \
--service <service-name> \
--query properties.source.runtimeVersion
下面的示例 Dockerfile 基于 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"]
若要使用此 Dockerfile 生成容器映像,请使用以下命令:
docker build -t <image-name>:<image-tag> \
-f JAR.dockerfile \
--build-arg JAR_FILENAME=<path-to-jar> \
.
有关自定义 JVM 选项的信息,请参阅 JVM 选项。
生成 WAR 文件
在生成 WAR 文件之前,需要确定要使用的 JDK 和 Tomcat 版本。
若要确定在 Azure Spring Apps 中运行的部署中使用的 Tomcat 版本,请使用以下命令:
az spring app deployment show \
--app <app-name> \
--name <deployment-name> \
--resource-group <resource-group> \
--service <service-name> \
--query properties.source.serverVersion
下面的示例显示了基于 JDK 17 的 Dockerfile:
# 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"]
若要使用此 Dockerfile 生成容器映像,请使用以下命令:
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> \
.
多阶段生成
前面提到的两种方法是仅包生成。 它们依赖于本地生成工具来管理生成过程,并将结果打包到 JAR 或 WAR 文件中。
如果不想在主机上安装生成工具或 JDK,但希望在不同计算机之间获得一致的结果,可以使用替代方法,即在 Dockerfile 中定义多个生成阶段。 一个阶段专用于编译和打包,另一个阶段用于处理映像生成过程。 有关详细信息,请参阅多阶段生成。
Azure 容器注册表任务
如果你有一个 Azure 容器注册表实例,可以使用 Azure 容器注册表任务生成、推送和运行容器映像。 有关详细信息,请参阅快速入门:使用 Azure 容器注册表任务生成和运行容器映像。