使用 Jib 构建 Java 容器

Jib 在不使用 Dockerfile 或不安装 Docker 的情况下构建容器。您可以在用于 MavenGradle 的 Jib 插件中使用 Jib,也可以使用 Jib Java 库

Jib 可以做什么?

Jib 处理将应用打包到容器映像中的所有步骤。您无需了解创建 Dockerfile 的最佳做法或安装 Docker。

Docker 构建流程:

图表显示了从项目到 Container Registry 使用 Docker 的各个阶段。

Jib 构建流程:

图表显示的是从项目到 Container Registry 的非中间阶段。

Jib 将您的应用整理成不同的层、依赖项、资源和类;并且利用 Docker 映像层缓存仅通过重建更改来保持构建速度。Jib 的层组织和小型基础映像可使整体映像尺寸变小,从而提升性能和可携性。

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Container Registry API.

    Enable the API

  7. 如果您没有安装 Java,请下载 Java,然后进行安装和配置。
  8. 安装 Maven 3.5 或更新版本
  9. 安装并初始化 Google Cloud CLI。
  10. 如需向 Container Registry 进行身份验证,请使用 Google Cloud CLI 作为 Docker 凭据帮助程序:
    gcloud auth configure-docker
    或者,请参考 Jib 配置文档了解其他身份验证方法。

使用 Jib 进行构建

  1. 选择一个现有项目并导航到源文件夹,或使用以下命令克隆该示例:

         git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
         cd java-docs-samples/run/helloworld

  2. 将插件添加到您的 pom.xml 中:

    <plugin>
      <groupId>com.google.cloud.tools</groupId>
      <artifactId>jib-maven-plugin</artifactId>
      <version>2.8.0</version>
      <configuration>
        <to>
          <image>gcr.io/PROJECT/IMAGE</image>
        </to>
      </configuration>
    </plugin>
    

    替换

    • PROJECT 替换为 Google Cloud 项目 ID。
    • IMAGE 替换为您的映像名称。

    如果您不想修改 pom.xml,可以使用以下命令:

        mvn compile com.google.cloud.tools:jib-maven-plugin:2.8.0:build \
            -Dimage=gcr.io/PROJECT/IMAGE
  3. 构建映像并将其推送到 Container Registry:

    mvn compile jib:build

    您可以在 Container Registry 中查看容器来验证是否成功。

    (可选)如果您安装了 Docker,则可以构建本地 Docker 安装,以便将映像作为任何其他本地容器进行检查或运行:

    mvn compile jib:dockerBuild

其他自定义内容

您可以使用与 Dockerfiles 类似的方式自定义 Jib 版本,例如添加环境变量和选择基础映像。

添加环境变量

您可以将环境变量添加到构建,类似于 Dockerfile 中的 ENV 指令,如下所示:

<plugin>
  <groupId>com.google.cloud.tools</groupId>
  <artifactId>jib-maven-plugin</artifactId>
  <version>2.8.0</version>
  <configuration>
    <to>
      <image>gcr.io/PROJECT/IMAGE</image>
    </to>
    <container>
      <environment>
        <ENV_VAR>VALUE</ENV_VAR>
      </environment>
    </container>
  </configuration>
</plugin>

替换

  • PROJECT 替换为 Google Cloud 项目 ID。
  • IMAGE 替换为您的映像名称。
  • ENV_VAR 替换为 NAME
  • VALUE 替换为所需的值。

现在,您的应用将使用 Hello <var>VALUE</var>! 进行响应

更改基础映像

基础映像与 Dockerfile 中的 FROM 指令相同。您可以通过更改字段 from.image 来更新基础映像。

如果要包含用于调试的 shell,请将基础映像设置为 alpine:3openjdk:VERSION(如果需要 Java)。

如需添加系统软件包,您必须创建一个已安装这些软件包的基础映像。有关详情,请参阅构建容器

  <plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>2.8.0</version>
    <configuration>
      <from>
        <image>gcr.io/PROJECT/BASE_IMAGE</image>
      </from>
      <to>
        <image>gcr.io/PROJECT/IMAGE_NAME</image>
      </to>
    </configuration>
  </plugin>

尝试将 from.image 字段更新为其他 Java 基础映像,例如 openjdk:8-alpine

自定义其他 Java 方面

Jib 支持运行应用时可能需要的 Java 运行时配置。如需更多自定义信息,请参阅扩展用途

开发代码

设置 gcloud 默认值

要配置您的 Cloud Run 服务的 gcloud 默认值,请执行以下操作:

  1. 设置默认项目:

    gcloud config set project PROJECT_ID

    PROJECT_ID 替换为您在本教程中创建的项目的名称。

  2. 为您选择的区域配置 gcloud:

    gcloud config set run/region REGION

    REGION 替换为您选择的受支持的 Cloud Run 区域

Cloud Run 位置

Cloud Run 是地区级的,这意味着运行 Cloud Run 服务的基础架构位于特定地区,并且由 Google 代管,以便在该地区内的所有区域以冗余方式提供。

选择用于运行 Cloud Run 服务的地区时,主要考虑该地区能否满足您的延迟时间、可用性或耐用性要求。通常,您可以选择距离用户最近的地区,但除此之外,您还应该考虑 Cloud Run 服务使用的其他 Google Cloud 产品的位置。跨多个位置使用 Google Cloud 产品可能会影响服务的延迟时间和费用。

Cloud Run 可在以下地区使用:

基于层级 1 价格

基于层级 2 价格

  • asia-east2(香港)
  • asia-northeast3(韩国首尔)
  • asia-southeast1(新加坡)
  • asia-southeast2 (雅加达)
  • asia-south1(印度孟买)
  • asia-south2(印度德里)
  • australia-southeast1(悉尼)
  • australia-southeast2(墨尔本)
  • europe-central2(波兰,华沙)
  • europe-west2(英国伦敦)
  • europe-west3(德国法兰克福)
  • europe-west6(瑞士苏黎世) 叶形图标 二氧化碳排放量低
  • northamerica-northeast1(蒙特利尔) 叶形图标 二氧化碳排放量低
  • northamerica-northeast2(多伦多) 叶形图标 二氧化碳排放量低
  • southamerica-east1(巴西圣保罗) 叶形图标 二氧化碳排放量低
  • southamerica-west1(智利圣地亚哥)
  • us-west2(洛杉矶)
  • us-west3(盐湖城)
  • us-west4(拉斯维加斯)

如果您已创建 Cloud Run 服务,则可以在 Cloud Console 的 Cloud Run 信息中心查看相应的地区。

部署到 Cloud Run

使用 gcloud CLI 从 Container Registry 中将容器部署到 Cloud Run 或 Cloud Run for Anthos。

使用以下命令部署容器映像:

gcloud run deploy SERVICE-NAME \
    --image gcr.io/PROJECT/IMAGE \
    --platform managed

替换

  • SERVICE-NAME 替换为您选择的服务名称。
  • PROJECT 替换为 Google Cloud 项目 ID。
  • IMAGE 替换为您的映像名称。

请注意,容器映像已部署到您之前在设置 gcloud 中配置的服务和区域 (Cloud Run) 或集群 (Cloud Run for Anthos)。

如果部署到 Cloud Run,系统会提示您允许未通过身份验证的调用。如果您希望立即访问自己的服务,请在出现“允许未通过身份验证的调用”提示时回复 y“是”。如果您的服务是私有的,并且请求必须包含身份验证,请在出现“允许未通过身份验证的调用”提示时回复 n“否”。

如果您的服务是公共的,请使用成功部署后显示的网址来访问部署的容器。如果您的服务是私有的,请使用以下 curl 命令来调用您的服务:

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL

如果部署到 Cloud Run for Anthos,请参阅访问已部署的服务

清除数据

如果您为本教程创建了一个新项目,请删除项目。 如果您使用的是现有项目,希望保留此项目且不保留本教程中添加的任何更改,请删除为教程创建的资源

删除项目

为了避免产生费用,最简单的方法是删除您为本教程创建的项目。

如需删除项目,请执行以下操作:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

删除教程资源

  1. 删除您在本教程中部署的 Cloud Run 服务:

    gcloud run services delete SERVICE-NAME

    其中,SERVICE-NAME 是您选择的服务名称。

    您还可以从 Google Cloud Console 中删除 Cloud Run 服务。

  2. 移除您在教程设置过程中添加的 gcloud 默认区域配置:

     gcloud config unset run/region
    
  3. 移除项目配置:

     gcloud config unset project
    

后续步骤

  • 如需详细了解容器在部署到 Cloud Run 时必须遵循的合同,请参阅容器合同
  • 要使用 Cloud Build 触发器实现 Cloud Run 服务的自动构建和部署,请设置持续部署
  • 如需详细了解如何使用和自定义 Jib,请参阅 Jib 的 GitHub 代码库