gpt4 book ai didi

java - Google Cloud Platform 管道/容器构建器使用 COPY 或 ADD 命令为 Spring Boot Java 应用程序构建 docker 镜像时出现问题

转载 作者:行者123 更新时间:2023-11-30 01:55:18 25 4
gpt4 key购买 nike

使用 Spring Boot (2.1.3)、Java 8、Maven 创建基本的 HelloWorld 微服务。

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

通过创建容器进行验证。已将代码 checkin 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}'
- '.'

这没有任何区别。问题仍然相同。

知道 Springboot Java 应用程序是否有一些特定的配置可以在 Google Cloud Platform 中很好地构建 Dockerfile 吗?

<小时/>

更新 - 1

基于在本地计算机上尝试以下步骤的评论:

  1. 运行命令 mvn clean 。已清理的目标文件夹

  2. 更新了 Dockerfile

FROM maven:3.5-jdk-8 AS build
COPY src .
COPY pom.xml .
RUN mvn -f pom.xml clean package

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

  • docker build . -t helloworld:v1命令和创建的图像。

  • 然后运行命令来启动容器: 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)

    最佳答案

    看起来像是文件路径有问题。

    尝试以下更新的 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"]

    附加说明:

    • 请参阅related answer有关构建 Spring Boot 应用程序的完整示例
    • 我已将第二阶段基于 JRE 镜像。减小输出图像的尺寸。

    关于java - Google Cloud Platform 管道/容器构建器使用 COPY 或 ADD 命令为 Spring Boot Java 应用程序构建 docker 镜像时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54727866/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com