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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM