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
问题根本原因:
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