你当前正在访问 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 文件部署容器应用。

先决条件

  • Docker
  • 用于容器映像存储的现有容器注册表。 对于 Azure 容器注册表,可以使用 Azure 门户或通过 Azure CLI 进行设置。

生成容器映像

如果要创建与 Azure Spring Apps 中使用的容器映像一致的容器映像,可以自行生成映像。 若要将 JAR 文件、WAR 文件或 Java 源代码生成到容器映像中,请使用以下常规步骤:

  1. 将 Java 源代码生成到 JAR 文件或 WAR 文件中。
  2. 创建 Dockerfile 并执行以下操作:
    1. (仅适用于 WAR 文件)下载 Tomcat 并对其进行配置。
    2. 将 JAR 文件或 WAR 文件复制到容器映像中。
    3. 指定容器映像的入口点。
  3. 使用在上一步中创建的 Dockerfile 运行 docker build 命令来创建容器映像。
  4. 将容器映像推送到公共或专用容器注册表,以便稍后可以在 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 容器注册表任务生成和运行容器映像