Spring boot 如何将SpringBootMaven插件构建映像与skaffold和dekorate一起使用?

Spring boot 如何将SpringBootMaven插件构建映像与skaffold和dekorate一起使用?,spring-boot,maven,kubernetes,skaffold,Spring Boot,Maven,Kubernetes,Skaffold,我试着用斯卡福德,德科拉特和弹簧靴 我找不到任何使用SpringBoot2.3新构建包特性的例子+ apiVersion: skaffold/v2beta9 kind: Config metadata: name: tellus-upgrade build: artifacts: - image: tellus-admin custom: buildCommand: ./mvnw -pl tellus-admin org.springframework

我试着用斯卡福德,德科拉特和弹簧靴

我找不到任何使用SpringBoot2.3新构建包特性的例子+

apiVersion: skaffold/v2beta9
kind: Config
metadata:
  name: tellus-upgrade
build:
  artifacts:
    - image: tellus-admin
      custom:
        buildCommand: ./mvnw -pl tellus-admin org.springframework.boot:spring-boot-maven-plugin:2.4.0:build-image -Dspring-boot.build-image.imageName=$IMAGE -Drevision=dev-SNAPSHOT -DskipTests=true
        dependencies:
          paths:
            - tellus-admin/src
            - tellus-admin/pom.xml
    - image: tellus-config-server
      custom:
        buildCommand: ./mvnw -pl tellus-config-server org.springframework.boot:spring-boot-maven-plugin:2.4.0:build-image -Dspring-boot.build-image.imageName=$IMAGE -Drevision=dev-SNAPSHOT -DskipTests=true
        dependencies:
          paths:
            - tellus-config-server/src
            - tellus-config-server/pom.xml
deploy:
  kubectl:
    manifests:
    - kubernetes/defaults.yml
    - kubernetes/db/kubernetes.yml
    - kubernetes/dev/dnsutils.yml
    - kubernetes/kafka-connect/kubernetes.yml
    - tellus-admin/target/classes/META-INF/dekorate/kubernetes.yml
    - tellus-config-server/target/classes/META-INF/dekorate/kubernetes.yml
当我运行Skafold dev时,我得到一个错误: 由于第一次生成失败而退出开发模式:自定义脚本未生成带有标记[tellus config server:RELEASE_2020_2_0-226-g9be76a373-dirty]的映像

但是从日志上看,这张图片看起来像是被制作出来的

[INFO] Successfully built image 'docker.io/library/tellus-config-server:RELEASE_2020_2_0-226-g9be76a373-dirty'
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  17.004 s
[INFO] Finished at: 2020-11-15T22:31:59+11:00
[INFO] ------------------------------------------------------------------------
Building [tellus-admin]...
exiting dev mode because first build failed: the custom script didn't produce an image with tag [tellus-config-server:RELEASE_2020_2_0-226-g9be76a373-dirty]

springbootmaven插件:buildimage
将映像加载到本地Docker守护进程中,但不推送映像。我从未尝试过,但您可能可以使用
com.spotify:dockerfile maven插件:push
目标

更新:这里有一个Skaffold自定义构建脚本,它应该做正确的事情:

#!/bin/sh
set -e
cd "$BUILD_CONTEXT"
mvn -pl "$1" -Drevision=dev-SNAPSHOT -DskipTests=true \
  org.springframework.boot:spring-boot-maven-plugin:build-image \
  -Dspring-boot.build-image.imageName="$IMAGE"
if [ "$PUSH_IMAGE" = true ]; then
    docker push "$IMAGE"
fi
您可以将其保存到文件
mvn build image.sh
,然后修改skaffold.yaml,如:

artifacts:
- image: tellus-admin
  custom:
    buildCommand: ./mvn-build-image.sh tellus-admin 


您可能希望查看以简化此过程。

如果问题是基于Paketo/spring boot maven插件,它只生成本地容器映像,而不是按原样推送,那么应该可以解决这个问题。因此,只需将以下内容附加到
mvn spring boot:build image
命令:

mvn spring-boot:build-image -Dspring-boot.build-image.publish=true
您还可以像下面这样明确地配置映像名称:

mvn spring-boot:build-image -Dspring-boot.build-image.imageName=docker.example.com/library/tellus-config-server:latest -Dspring-boot.build-image.publish=true
您还可以在
pom.xml
中配置图像发布的各个方面:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <image>
            <name>docker.example.com/library/${project.artifactId}</name>
            <publish>true</publish>
        </image>
        <docker>
            <publishRegistry>
                <username>user</username>
                <password>secret</password>
                <url>https://docker.example.com/v1/</url>
                <email>user@example.com</email>
            </publishRegistry>
        </docker>
    </configuration>
</plugin>

org.springframework.boot

-因此,如果您想切换到,这可能是另一个可以查看的选项(因为
spring boot maven插件
也是“唯一”云原生Buildpack/Paketo.io集成的抽象)。

谢谢!我最终让它工作起来,而不需要运行docker push-我想我需要运行
eval$(minikube docker env)
运行
eval$(minikube docker env)
确保Skafold将使用minikube打包的docker守护程序(而不是本地docker守护程序)进行构建。Minikube使用它自己的docker守护进程中的图像。虽然Skaffold通常会检测到您正在使用minikube,并使用运行
minikube docker env
中的值对自身进行配置,但您不需要运行该eval表达式。如果您对进一步诊断此问题感兴趣,请在打开一个问题,并包含运行
skaffold build-v debug
的日志。