-1

我正在使用packcli 构建图像:

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 无法找到 artifact cat.gencat.catsalut.hes:hes-spring-boot-core:jar:1.0.6

pack cli执行上述命令时不会出现此错误!

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

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

dependencies: skaffold 应该监视此工件的重建和文件同步的文件依赖项。

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

我正在使用 skaffold v1.35.1

信息

  • 支架版本: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"]

4

1 回答 1

1

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

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

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


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

Skaffold 还具有对使用 Jib 的本机支持。

我不知道 Paketo Java buildpacks 是否支持构建多模块项目,但 GCP Java Buildpacks目前不支持。


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

于 2022-01-07T15:53:01.847 回答