将 workspace maven 构建输出放入容器构建任务的正确上下文是什么?

What is correct context for getting workspace maven build output into container build task?

这与 类似,但我似乎无法弄清楚有什么区别。

我正在尝试构建一个简单的 Java 程序并使用 Google Cloud Build 将其打包到容器中。我主要关注 https://cloud.google.com/build/docs/building/build-java but using my own repo which is a fork of https://github.com/jchraibi/cloud-native-workshop

steps:
  - name: 'maven:3-openjdk-11'
    args:
      - test
      - '-f=code/inventory-quarkus/pom.xml'
    entrypoint: mvn
  - name: 'maven:3-openjdk-11'
    args:
      - package
      - '-f=code/inventory-quarkus/pom.xml'
      - '-Dmaven.test.skip=true'
    entrypoint: mvn
  - name: 'gcr.io/cloud-builders/docker'
    args: 
      - 'build'
      - '-t'
      - 'gcr.io/$PROJECT_ID/inventory-quarkus'
      - '--build-arg=JAR_FILE=workspace/code/inventory-quarkus/target/$_BUILD_ARTIFACT'
      - '-f' 
      - 'code/inventory-quarkus/gcp/Dockerfile'
      - '/workspace'

以上是构建步骤。 maven 打包完成后,输出如下:

Step #1: [INFO] [io.quarkus.deployment.pkg.steps.JarResultBuildStep] Building thin jar: /workspace/code/inventory-quarkus/target/inventory-quarkus-1.0.0-SNAPSHOT-runner.jar

但是,无论我尝试将复制内容和上下文组合成何种组合,我似乎都无法在 Docker 构建的文件系统中的任何地方找到 inventory-quarkus-1.0.0-SNAPSHOT-runner.jar。请注意,Docker文件所在的位置与构建目标似乎结束的位置不同。

FROM openjdk:11
ARG JAR_FILE=JAR_FILE_MUST_BE_SPECIFIED_AS_BUILD_ARG
RUN find .
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Djava.security.edg=file:/dev/./urandom","-jar","/app.jar"]

有趣的是,在日志中,find 命令的输出根本没有工作区文件夹。我确定这与 Dockerfile 不在回购协议的根目录中有关,但我找不到正确的调用。

这个 post 开头的 link 到另一个线程结束时使用了额外的步骤 git 图像来做某种复制,但我没有不明白为什么需要这样做,因为所有 Google 示例都不必经历那样的任何麻烦。

build containers 文档有以下声明:

If your Dockerfile and source code are in different directories, add -f and the path to the Dockerfile to the list of arguments in the args field:

这绝对是我在构建步骤中所做的。它显然正在寻找 Docker 文件,因为它正在处理查找和复制。我似乎无法找到 where/how 将 Maven 包步骤的工作区文件夹放入构建器,或者从中复制文件的源路径是什么。

感谢您的提问!我克隆了您的存储库并在根目录中添加了一个 cloudbuild.yaml,并在 inventory-quarkus/src/main/docker 目录中添加了一个 Dockerfile。我确定这不完全是您正在使用的回购结构,但这个概念应该延续下去。

本质上,您想使用 dir field 在步骤之间设置您的工作目录,以便更轻松地传递数据。这个 cloudbuild.yaml 对我有用:

steps:
  # Test
  - name: 'maven:3-openjdk-11'
    entrypoint: mvn
    args:
      - test
      - '-f=labs/inventory-quarkus/pom.xml'

  # Package
  - name: 'maven:3-openjdk-11'
    entrypoint: mvn
    dir: 'labs/inventory-quarkus'
    args:
      - package 
      - -f=pom.xml 
      - -Dmaven.test.skip=true

  # Docker Build
  - name: 'gcr.io/cloud-builders/docker'
    dir: 'labs/inventory-quarkus'
    args: 
      - 'build'
      - '-t'
      - 'gcr.io/$PROJECT_ID/inventory-quarkus'
      - '--build-arg=JAR_FILE=target/inventory-quarkus-1.0.0-SNAPSHOT-runner.jar'
      - '-f' 
      - 'src/main/docker/Dockerfile'
      - '.'

我还想提请您注意我们现在 Artifact Registry,如果您想将 JAR 存储在那里并从云中提取它。您也可以用它来存储您的 Docker 图片。