【问题标题】:skaffold: build image using local maven dependencyskaffold:使用本地 maven 依赖构建图像
【发布时间】:2022-01-05 23:15:32
【问题描述】:

我正在使用pack cli 构建我的图像:

pack build fhir-mongo --builder paketobuildpacks/builder:base --path target/hes-mpi-fhir-mongodb-service-0.0.1-SNAPSHOT.jar

这是我的项目结构:

.
├── hes-mpi-fhir-mongodb
│  ├── deployment.yaml
│  ├── pom.xml
│  ├── skaffold.yaml
│  └──  src
└── hes-spring-boot-core     <<< dependency requiered by hes-mpi-fhir-mongodb
   ├── pom.xml
   └── src

如您所见,我管理着两个 maven 项目。

我的主机构建步骤是:

$ hes-spring-boot-core > mvn clean install
$ hes-mpi-fhir-mongodb > mvn clean package

我的意思是,我首先将hes-spring-boot-core 安装到本地存储库中,然后构建hes-mpi-fhir-mongodb

我的skaffold.yml 文件是:

apiVersion: skaffold/v2beta26
kind: Config
metadata:
  name: hes-mpi-fhir-mongodb
build:
  artifacts:
  - image: pom-xml-image
    buildpacks:
      builder: paketobuildpacks/builder:base
profiles:
  - name: dev
    deploy:
      kustomize:
        paths: ["kustomize/dev"]

我在尝试构建映像时收到此消息:

...
[builder] Running "/layers/google.java.maven/maven/bin/mvn clean package --batch-mode -DskipTests -Dhttp.keepAlive=false --quiet"
[builder] [ERROR] Failed to execute goal on project hes-mpi-fhir-mongodb-service: Could not resolve dependencies for project cat.gencat.catsalut.hes.mpi.fhir:hes-mpi-fhir-mongodb-service:jar:0.0.1-SNAPSHOT: Could not find artifact cat.gencat.catsalut.hes:hes-spring-boot-core:jar:1.0.6 in central (https://repo.maven.apache.org/maven2)

maven builder 无法找到工件 cat.gencat.catsalut.hes:hes-spring-boot-core:jar:1.0.6,这让我很生气。

我执行上面pack cli命令时没有出现这个错误!

如何将此项目添加为依赖项?

我查看了文档。有些领域让我很困惑:

dependencies: skaffold 应该注意的文件依赖关系,用于此工件的重建和文件同步。

工件依赖性:您可以使用 requires 关键字定义对其他工件的依赖性。这对于将另一个工件图像指定为 builder 或 runImage 很有用。

我正在使用 skaffold v1.35.1

信息

  • skaffold 版本:1.35.1
  • 操作系统:
  • 通过安装:skaffold.dev
  • skaffold.yaml 的内容:
apiVersion: skaffold/v2beta26
kind: Config
metadata:
  name: hes-mpi-fhir-mongodb
build:
  artifacts:
  - image: pom-xml-image
    context: target/hes-mpi-fhir-mongodb-service-0.0.1-SNAPSHOT.jar
    buildpacks:
      builder: paketobuildpacks/builder:base
      dependencies:
        paths:
          - "target/hes-mpi-fhir-mongodb-service-0.0.1-SNAPSHOT.jar"
    # requires:
    #   - image: core
profiles:
  - name: dev
    deploy:
      kustomize:
        paths: ["kustomize/dev"]

我还尝试构建两个图像。但是问题来了。

apiVersion: skaffold/v2beta26
kind: Config
metadata:
  name: hes-mpi-fhir-mongodb
build:
  artifacts:
  - image: core
    context: ../hes-spring-boot-core
    buildpacks:
      builder: paketobuildpacks/builder:base
      env:
        - "BP_MAVEN_BUILD_ARGUMENTS=install"
  - image: pom-xml-image
    # context: target/hes-mpi-fhir-mongodb-service-0.0.1-SNAPSHOT.jar
    buildpacks:
      builder: paketobuildpacks/builder:base
      dependencies:
        paths:
          - "target/hes-mpi-fhir-mongodb-service-0.0.1-SNAPSHOT.jar"
    requires:
      - image: core
profiles:
  - name: dev
    deploy:
      kustomize:
        paths: ["kustomize/dev"]

【问题讨论】:

    标签: maven buildpack skaffold paketo


    【解决方案1】:

    从你的描述中我并没有完全理解发生了什么,但它似乎相当复杂。

    认为您正在从 Maven 构建中生成多个 jar 文件,然后希望使用带有构建包的 Skaffold 将这些生成的 jar 打包到容器映像中。这里有可能打包陈旧的 jar 文件的风险。在我看来,更好的解决方案是让您的 Maven 构建创建 jar 和容器镜像(例如,使用 Jib 或 Spring Boot 的镜像创建),或者使用 Skaffold 来编排 Maven 构建和构建容器镜像。

    另一个复杂情况是,Buildpack 构建通过在 docker 容器中运行而与本地文件系统隔离。当触发 buildpacks 构建时,本地文件系统的一部分会被复制到容器中,然后构建就无法进一步访问本地文件系统。对于pack build,此副本植根于当前目录。对于 Skaffold 触发的构建,此副本源自 context 字段,默认为当前目录。 buildpacks 不会看到此副本之外的任何文件。因此,作为一个工件的 buildpacks 构建的一部分执行的 mvn install 将不会在另一个工件中看到。


    如果您只是想构建然后将 jar 打包到容器映像中,请考虑查看 Jib。 Jib 提供了一个 Maven 插件,并且很容易集成到您现有的 Maven 构建中。它支持Spring apps,并使用一些漂亮的技巧来加快打包图像的速度。您可以使用配置文件和将目标绑定到阶段来决定何时生成图像。

    Skaffold 还原生支持使用 Jib。

    我不知道 Paketo Java buildpacks 是否支持构建多模块项目,但 GCP Java Buildpacks do not currently.


    另外:您的构建错误包括对/layers/google.java.maven 的引用,这表明您正在尝试 GCP Buildpacks。

    【讨论】:

    • Paketo Java buildpack 将与多模块 Maven 项目一起使用,但您可能需要将它指向您想要从构建传播到容器映像的工件(它只接受一个在这一刻)。您将$BP_MAVEN_BUILT_ARTIFACT 设置为工件,默认为target/*.[ejw]ar
    • GCP Buildpacks 可以通过让根模块创建单个工件(例如使用 maven shade 插件)以类似但更有限的方式处理多模块项目。
    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2012-01-15
    相关资源
    最近更新 更多