如何在 google cloudbuild 上构建 quarkus 原生镜像
How to build quarkus native image on google cloudbuild
有没有人知道如何在 cloudbuild 上构建 quarkus 原生镜像?
我使用以下命令来执行此操作:
- name: maven:3-jdk-11
entrypoint: mvn
args: ["package", "-Dmaven.test.skip=true", "-Pnative", "-Dquarkus.native.container-build=true", "-Dquarkus.container-image.build=true"]
本地一切正常,但当我尝试在 Google Cloud 上执行时,它会抛出错误:
[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.12.2.Final:build (default) on project fishki: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[ERROR] [error]: Build step io.quarkus.deployment.pkg.steps.NativeImageBuildStep#build threw an exception: java.lang.IllegalStateException: No container runtime was found to run the native image builder
[ERROR] at io.quarkus.deployment.pkg.steps.NativeImageBuildContainerRunner.detectContainerRuntime(NativeImageBuildContainerRunner.java:114)
我的想法是尝试为 运行 原生映像生成器提供容器 运行时间,但我不知道该怎么做。
我将不胜感激任何帮助,谢谢!
编辑:
我使用以下cloudbuild.yaml
steps:
- name: maven:3-jdk-11
entrypoint: mvn
args: ["quarkus:add-extension", "-Dextensions=container-image-docker"]
- name: docker:latest
- name: maven:3-jdk-11
entrypoint: mvn
args: ["package", "-Pnative", "-Dmaven.test.skip=true", "-Dquarkus.container-image.build=true", "-Dquarkus.native.container-build=true", "-Dquarkus.native.container-runtime=docker"]
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'gcr.io/XXX-XX-XXX/XX-XXX', '.' ]
- name: "gcr.io/cloud-builders/docker"
args: ["push", "gcr.io/XXXX/XXX-XXXX"]
- name: "gcr.io/cloud-builders/gke-deploy"
args:
- run
- --filename=./deployment.yaml
- --image=gcr.io/XXX/XXX:latest
- --location=europe-west1-b
- --cluster=XX-XXX-XXX-1
现在我有一个新问题——当我尝试安装docker容器运行时,我得到以下错误:
[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.12.2.Final:build (default) on project fishki: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[ERROR] [error]: Build step io.quarkus.deployment.pkg.steps.NativeImageBuildStep#build threw an exception: java.lang.RuntimeException: Failed to pull builder image quay.io/quarkus/ubi-quarkus-native-image:21.0.0-java11
对于每个构建步骤,Cloud Build 都会执行一个 docker 容器作为 docker 运行 的实例。您的应用程序需要的是容器 运行time 本身。因此,您不能使用预构建的 Maven 构建器构建您的容器,因为该图像不具备您的应用程序所需的要求。通过查看 Quarkus docs,您可以看到构建本机可执行文件需要 Docker 运行时间。
更新:一种解决方案是创建您自己的 custom builder,您可以在其中设置满足所有要求的环境(JDK、Maven、Docker, 等), 然后在构建步骤中使用它而不是使用预制的构建器。
请参阅此说明如何 build containers with a Dockerfile。
作为附加参考,这里是 Quarkus quickstart guide。
我为此苦苦挣扎了一段时间,但是您提出的问题中的信息对我帮助很大,所以感谢您提供的想法让我解决了这个问题。
我最终这样做的方式是像这样构建自定义构建映像 (Dockerfile
):
FROM maven:3-jdk-11
run apt-get update
run apt-get install docker.io -y
run docker --version
你可以在这里找到我的构建镜像(注意:我的构建镜像使用 gradle,而不是 Maven):
https://hub.docker.com/repository/docker/lackrobin/quarkus-gradle-build-image
将此映像推送到 gcr,或您可以从 google 云构建访问的任何其他注册表。
在 cloudbuild.yaml
文件中,以下配置应该可以解决问题:
steps:
- name: gcr.io/[link to the builder image above]
args:
- addExtension
- '--extensions=container-image-docker'
- build
- '-Dquarkus.package.type=native'
- '-Dquarkus.native.native-image-xmx=16g'
- '-Dorg.gradle.jvmargs=-Xmx3g -XX:MaxPermSize=2048m'
entrypoint: ./gradlew
- name: gcr.io/cloud-builders/docker
args:
- build
- '-t'
- gcr.io/[project name]/[image name]
- '-f'
- src/main/docker/Dockerfile.native
- .
images:
timeout: 2000s
- gcr.io/gcr.io/[project name]/[image name]
options:
machineType: E2_HIGHCPU_32
quarkus 或 GraalVM 使用大量资源来构建。我不得不使用具有更多资源的虚拟机来构建。 options
下的命令 machineType: E2_HIGHCPU_32
负责。
有没有人知道如何在 cloudbuild 上构建 quarkus 原生镜像? 我使用以下命令来执行此操作:
- name: maven:3-jdk-11
entrypoint: mvn
args: ["package", "-Dmaven.test.skip=true", "-Pnative", "-Dquarkus.native.container-build=true", "-Dquarkus.container-image.build=true"]
本地一切正常,但当我尝试在 Google Cloud 上执行时,它会抛出错误:
[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.12.2.Final:build (default) on project fishki: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[ERROR] [error]: Build step io.quarkus.deployment.pkg.steps.NativeImageBuildStep#build threw an exception: java.lang.IllegalStateException: No container runtime was found to run the native image builder
[ERROR] at io.quarkus.deployment.pkg.steps.NativeImageBuildContainerRunner.detectContainerRuntime(NativeImageBuildContainerRunner.java:114)
我的想法是尝试为 运行 原生映像生成器提供容器 运行时间,但我不知道该怎么做。
我将不胜感激任何帮助,谢谢!
编辑:
我使用以下cloudbuild.yaml
steps:
- name: maven:3-jdk-11
entrypoint: mvn
args: ["quarkus:add-extension", "-Dextensions=container-image-docker"]
- name: docker:latest
- name: maven:3-jdk-11
entrypoint: mvn
args: ["package", "-Pnative", "-Dmaven.test.skip=true", "-Dquarkus.container-image.build=true", "-Dquarkus.native.container-build=true", "-Dquarkus.native.container-runtime=docker"]
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'gcr.io/XXX-XX-XXX/XX-XXX', '.' ]
- name: "gcr.io/cloud-builders/docker"
args: ["push", "gcr.io/XXXX/XXX-XXXX"]
- name: "gcr.io/cloud-builders/gke-deploy"
args:
- run
- --filename=./deployment.yaml
- --image=gcr.io/XXX/XXX:latest
- --location=europe-west1-b
- --cluster=XX-XXX-XXX-1
现在我有一个新问题——当我尝试安装docker容器运行时,我得到以下错误:
[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.12.2.Final:build (default) on project fishki: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[ERROR] [error]: Build step io.quarkus.deployment.pkg.steps.NativeImageBuildStep#build threw an exception: java.lang.RuntimeException: Failed to pull builder image quay.io/quarkus/ubi-quarkus-native-image:21.0.0-java11
对于每个构建步骤,Cloud Build 都会执行一个 docker 容器作为 docker 运行 的实例。您的应用程序需要的是容器 运行time 本身。因此,您不能使用预构建的 Maven 构建器构建您的容器,因为该图像不具备您的应用程序所需的要求。通过查看 Quarkus docs,您可以看到构建本机可执行文件需要 Docker 运行时间。
更新:一种解决方案是创建您自己的 custom builder,您可以在其中设置满足所有要求的环境(JDK、Maven、Docker, 等), 然后在构建步骤中使用它而不是使用预制的构建器。
请参阅此说明如何 build containers with a Dockerfile。
作为附加参考,这里是 Quarkus quickstart guide。
我为此苦苦挣扎了一段时间,但是您提出的问题中的信息对我帮助很大,所以感谢您提供的想法让我解决了这个问题。
我最终这样做的方式是像这样构建自定义构建映像 (Dockerfile
):
FROM maven:3-jdk-11
run apt-get update
run apt-get install docker.io -y
run docker --version
你可以在这里找到我的构建镜像(注意:我的构建镜像使用 gradle,而不是 Maven): https://hub.docker.com/repository/docker/lackrobin/quarkus-gradle-build-image
将此映像推送到 gcr,或您可以从 google 云构建访问的任何其他注册表。
在 cloudbuild.yaml
文件中,以下配置应该可以解决问题:
steps:
- name: gcr.io/[link to the builder image above]
args:
- addExtension
- '--extensions=container-image-docker'
- build
- '-Dquarkus.package.type=native'
- '-Dquarkus.native.native-image-xmx=16g'
- '-Dorg.gradle.jvmargs=-Xmx3g -XX:MaxPermSize=2048m'
entrypoint: ./gradlew
- name: gcr.io/cloud-builders/docker
args:
- build
- '-t'
- gcr.io/[project name]/[image name]
- '-f'
- src/main/docker/Dockerfile.native
- .
images:
timeout: 2000s
- gcr.io/gcr.io/[project name]/[image name]
options:
machineType: E2_HIGHCPU_32
quarkus 或 GraalVM 使用大量资源来构建。我不得不使用具有更多资源的虚拟机来构建。 options
下的命令 machineType: E2_HIGHCPU_32
负责。