Google Cloud Platform管道/容器构建器使用用于Spring Boot Java Application的COPY或ADD命令来发布构建docker镜像

问题描述 投票:1回答:1

使用Spring Boot(2.1.3),Java 8,Maven创建基本的Hello World微服务。

pom.xml有maven插件条目,如下所示

<plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                    <mainClass>com.example.HelloWorldApplication</mainClass>
            </configuration>
        </plugin>

Dockerfile如下所示

FROM openjdk:8
VOLUME /tmp
ADD target/helloworld.jar helloworld.jar
EXPOSE 8081
ENTRYPOINT ["java","-jar","helloworld.jar"]

使用命令在本地计算机上创建映像

docker build . -t helloworld:v1

通过创建容器来验证它。检查代码到docker-hub帐户和github帐户。

登录Google云平台(GCP),创建kubernetes集群,通过配置helloworld微服务代码所在的github url创建管道(使用容器构建器)。运行构建有两个选项(使用Dockerfile或cloudbuild.yaml)。我正在使用Dockerfile来运行构建。

当构建被选中以运行时,它在Dockerfile中的这一行失败

ADD target/helloworld.jar helloworld.jar

在GCP日志中看到错误:

ADD failed: stat /var/lib/docker/tmp/docker-builderxxxxxx/target/helloworld.jar: no such file or directory

我试图用COPY命令替换它,但问题仍然存在。

注意:我尝试使用cloudbuild.yaml以下是我的cloudbuild.yaml的外观:

  steps:
  # Build the helloworld container image.
  - name: 'gcr.io/cloud-builders/docker'
    args:
      - 'build'
      - '-t'
      - 'gcr.io/${PROJECT_ID}/helloworld:${TAG_NAME}'
      - '.'

这没有任何区别。问题仍然存在。

有没有想过Spring Boot Java应用程序是否有一些特定的配置可以在Google Cloud Platform中构建Dockerfile?


更新 - 1

基于以下在本地计算机上执行的注释:

  1. 跑命令mvn clean。清理目标文件夹
  2. 更新了Dockerfile

来自maven:3.5-jdk-8 AS build COPY src。 COPY pom.xml。 运行mvn -f pom.xml清理包

来自openjdk:8 VOLUME / tmp COPY --from = build target / helloworld.jar helloworld.jar EXPOSE 8081 ENTRYPOINT [“java”,“ - jar”,“helloworld.jar”]

  1. Ran docker build . -t helloworld:v1命令和创建的图像。
  2. 然后运行命令启动容器:docker run -p 8081:8081 -n helloworld-app -d helloworld:v1

容器启动并退出并在日志中出错:

Exception in thread "main" java.lang.ClassNotFoundException: com.example.HelloWorldApplication at java.net.URLClassLoader.findClass(URLClassLoader.java:382)

java spring-boot docker google-cloud-platform google-container-builder
1个回答
2
投票

看起来像文件路径的问题。

尝试以下更新的Dockerfile,它明确设置工作目录。在图像之间复制jar时,它还使用显式文件路径。

FROM maven:3.5-jdk-8-slim AS build
WORKDIR /home/app
COPY src     /home/app/src
COPY pom.xml /home/app
RUN mvn clean package

FROM openjdk:8-jre-slim
COPY --from=build /home/app/target/helloworld-0.0.1-SNAPSHOT.jar /usr/local/lib/helloworld.jar
EXPOSE 8081
ENTRYPOINT ["java","-jar","/usr/local/lib/helloworld.jar"]

补充说明:

  • 有关构建spring boot应用程序的完整示例,请参阅related answer
  • 我将第二阶段建立在JRE图像上。减小输出图像的大小。
© www.soinside.com 2019 - 2024. All rights reserved.