問題:我打算編寫一個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