我正在使用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"]
2条答案
按热度按时间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构建包。eit6fx6z2#
我遇到了同样的问题,并通过重写mvn
BP_MAVEN_BUILD_ARGUMENTS
和BP_MAVEN_BUILT_ARTIFACT
设法修复了它。假设您正在使用一个父maven项目,并且这两个项目是父项目的子模块。skaffold.yaml
将看起来像:这将在一个命令中构建这两个项目。请注意,
context
应该是root
。