Docker部署Springboot项目,Invalid or corrupt jarfile /app.jar

问题:我打算编写一个dockerfile,其主要是部署一个springboot项目。当dockerfile构建完镜像,使用docker run 的时候报错。

Dockerfile内容

# jdk16是我自己构建的基于centos的java环境
FROM jdk16:16.0.1
MAINTAINER wx
# volume 指定临时文件目录为/tmp
# 其效果是在主机/var/lib/docker目录下创建一个临时文件,并连接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名
COPY demo-0.0.1-SNAPSHOT.jar app.jar
#
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
#暴露8080端口
EXPOSE 8080
View Code

问题根本原因:

 1. 没有理解 RUN bash -c 'touch /app.jar'。

 2. 未注意我的环境的默认路径不是根,而是自定义的/mydocker/jdk.

解决思路:

1. 这个问题是什么?

   字面的意思是这个app.jar不可用或者无效。本地java -jar 是可以跑起来的,那说明本地的包应该是没问题的。

2. 难道是我的基础镜像环境有问题?

   验证环境问题,只需要将本地的一个目录挂载到依据基础镜像启动的容器就好了。具体

    docker run -it -d --name mytest -p 8070:8080 -v /Users/wx/myfile/docker_test/springboot:/data jdk16:16.0.1

  启动后在本地访问。发现是可以访问的。

3. 这个时候我开始怀疑dockerfile写的有问题。

   排查也相对简单。我可以先将jar包copy进去,不启动看看能不能启动起来。发现是可以的。这个时候突然进入了默认的目录(/mydocker/jdk)。我也突然醒悟,我的app.jar并不在根目录,而在这个我设置的默认目录。所以dockerfile找不到这个jar包,启动报错。

   当我按照这个思路再次修改后构建、启动还是报错。我去掉执行的命令进入到容器中发现 /mydocker/jdk 和根目录都有这个jar包。不同的是根目录下的jar包大小为0,不能运行。

4. 修改后正确的dockerfile. 

FROM jdk16:16.0.1

MAINTAINER wangxiang

# volume 指定临时文件目录为/tmp
# 其效果是在主机/var/lib/docker目录下创建一个临时文件,并连接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名
COPY demo-0.0.1-SNAPSHOT.jar /app.jar
#
RUN bash -c 'touch /app.jar'
# ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
#暴露8080端口
# EXPOSE 8080
View Code

 

posted @ 2021-05-25 13:28  小祥工作室  阅读(3722)  评论(0编辑  收藏  举报