Google Cloud Platform pipeline/container builder issue building docker image using COPY or ADD command for Spring Boot Java Application
Google Cloud Platform pipeline/container builder issue building docker image using COPY or ADD command for Spring Boot Java Application
使用 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
通过从中创建容器进行验证。
已将代码签入 docker-hub 帐户和 github 帐户。
登录 Google 云平台 (GCP),创建 kubernetes 集群,通过配置 github url 创建管道(使用容器构建器),其中 helloworld 微服务代码所在。 运行 构建有两个选项(使用 Dockerfile 或 cloudbuild.yaml)。我正在使用 Dockerfile 运行 build.
当构建被拾取到 运行 时,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 应用程序是否有一些特定的配置可以让 Dockerfile 在 Google Cloud Platform 中正常构建吗?
更新 - 1
基于在本地计算机上尝试以下步骤的评论:
运行 命令 mvn clean
。清除了目标文件夹
更新了 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"]
补充说明:
- 有关构建 spring 启动应用程序的完整示例,请参阅
- 我已将第二阶段基于 JRE 映像。减小输出图像的大小。
使用 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
通过从中创建容器进行验证。 已将代码签入 docker-hub 帐户和 github 帐户。
登录 Google 云平台 (GCP),创建 kubernetes 集群,通过配置 github url 创建管道(使用容器构建器),其中 helloworld 微服务代码所在。 运行 构建有两个选项(使用 Dockerfile 或 cloudbuild.yaml)。我正在使用 Dockerfile 运行 build.
当构建被拾取到 运行 时,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 应用程序是否有一些特定的配置可以让 Dockerfile 在 Google Cloud Platform 中正常构建吗?
更新 - 1
基于在本地计算机上尝试以下步骤的评论:
运行 命令
mvn clean
。清除了目标文件夹更新了 Dockerfile
FROM maven:3.5-jdk-8 AS build
COPY src .
COPY pom.xml .
RUN mvn -f pom.xml clean packageFROM 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"]
补充说明:
- 有关构建 spring 启动应用程序的完整示例,请参阅
- 我已将第二阶段基于 JRE 映像。减小输出图像的大小。