skaffold:使用本地maven依赖项构建映像

7rfyedvj  于 2023-01-20  发布在  Maven
关注(0)|答案(2)|浏览(192)

我正在使用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
  • 操作系统:
  • 安装方式:www.example.comskaffold.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"]
tgabmvqs

tgabmvqs1#

从你的描述来看,我并不完全理解发生了什么事,但似乎相当复杂。
我 * 认为 * 您正在从Maven构建生成几个jar文件,然后希望使用Skaffold和构建包将这些生成的jar打包到容器映像中。这里有一个风险,您可能会打包陈旧的jar文件。在我看来,更好的解决方案是让您的Maven构建创建jar和容器映像(例如,使用Jib或 Boot 的映像创建),或者使用Skaffold来编排Maven构建并构建容器映像。
另一个复杂的问题是,Buildpack构建通过在Docker容器中运行而与本地文件系统隔离。当触发Buildpack构建时,本地文件系统的一部分被复制到容器中,然后该构建无法进一步访问本地文件系统。对于pack build,此副本位于当前目录中。对于Skaffold触发的构建,这个副本的根目录是context字段,默认为当前目录。构建包不会看到这个副本之外的任何文件。因此,作为一个构件的构建包构建的一部分执行的mvn install不会在另一个构件中看到。
如果你只是想构建并打包你的jar到一个容器映像中,考虑一下Jib。Jib提供了一个Maven插件,可以很容易地集成到你现有的Maven构建中。它支持Spring apps,并且使用了一些漂亮的技巧来加速打包映像。你可以使用配置文件和绑定目标到阶段来决定何时生成映像。
Skaffold还提供了对使用Jib的原生支持。
我不知道Paketo Java构建包是否支持构建多模块项目,但GCP Java构建包do not currently支持。
附带说明:您的构建错误包括对/layers/google.java.maven的引用,这表明您正在尝试GCP构建包。

eit6fx6z

eit6fx6z2#

我遇到了同样的问题,并通过重写mvn BP_MAVEN_BUILD_ARGUMENTSBP_MAVEN_BUILT_ARTIFACT设法修复了它。假设您正在使用一个父maven项目,并且这两个项目是父项目的子模块。skaffold.yaml将看起来像:

buildpacks:
  builder: paketobuildpacks/builder:base
  env:
  - "BP_MAVEN_BUILD_ARGUMENTS=--projects hes-spring-boot-core,hes-mpi-fhir-mongodb --also-make package -DskipTests"
  - "BP_MAVEN_BUILT_ARTIFACT=hes-mpi-fhir-mongodb/target/*.jar"

这将在一个命令中构建这两个项目。请注意,context应该是root

相关问题