無極分期網(wǎng)站營銷型網(wǎng)站建設多少錢
文章目錄
- 1.問題描述
- 2.問題分析
- 3.問題解決
1.問題描述
此時處在 /home/ubuntu/app
目錄下,并且在該目錄下有一個 jenkins-0.0.1-SNAPSHOT.jar。
我在 /home/ubuntu/app
目錄下執(zhí)行了 docker 容器運行命令:
# 映射 8859 端口
# 容器名為 jenkins-demo
# 將 jenkins-0.0.1-SNAPSHOT.jar 復制到容器內(nèi)的 /app.jar
# 以 jdk11 為容器鏡像
# 執(zhí)行命令 java -jar /app.jar 運行 java 程序
docker run -dp 8859:8859 \
--name jenkins-demo \
-v jenkins-0.0.1-SNAPSHOT.jar:/app.jar \
openjdk:11 \
java -jar /app.jar
但遺憾的是,當我執(zhí)行命令后,并沒有運行起來。
2.問題分析
我們先查看一下日志:
提示錯誤信息:Error: Invalid or corrupt jarfile /app.jar
該錯誤表示的是 jar 文件無效或損壞,于是我開始考慮是不是 -v
掛載有問題。
于是我使用 docker inspect jenkins-demo
查看該容器信息,特別是掛載情況。然后查看 Mounts
下的信息:
我發(fā)現(xiàn) jenkins-0.0.1-SNAPSHOT.jar
成了數(shù)據(jù)卷名稱,/app.jar
是容器內(nèi)的目錄。
這時候我才突然想起來,如果在 -v
時直接寫個名稱,那么 docker 會將它識別為是一個數(shù)據(jù)卷名稱而不是本地文件或目錄名。
🚩 即:本地目錄或文件必須以 /
或 ./
開頭,如果直接以名字開頭,會被識別為數(shù)據(jù)卷名而非本地目錄名。例如:
# 會被識別為一個數(shù)據(jù)卷叫mysql,運行時會自動創(chuàng)建這個數(shù)據(jù)卷
-v mysql:/var/lib/mysql# 會被識別為當前目錄下的mysql目錄,運行時如果不存在會創(chuàng)建目錄
-v ./mysql:/var/lib/mysql
3.問題解決
我們可以將之前的 docker run 命令修改為以下兩種方式:
-
絕對路徑方式
docker run -dp 8859:8859 \ --name jenkins-demo \ -v /home/ubuntu/app/jenkins-0.0.1-SNAPSHOT.jar:/app.jar \ openjdk:11 \ java -jar /app.jar
-
相對路徑方式
# 需要保存當前執(zhí)行命令所在位置是在 /home/ubuntu/app 目錄下,因為我將 jenkins-0.0.1-SNAPSHOT.jar 就是放在了此目錄下 docker run -dp 8859:8859 \ --name jenkins-demo \ -v ./jenkins-0.0.1-SNAPSHOT.jar:/app.jar \ openjdk:11 \ java -jar /app.jar
這時候我們再使用 docker inspect jenkins-demo
查看數(shù)據(jù)卷掛載情況和我們希望的一樣了:
最后,還有一點可以注意,在指定 容器內(nèi)路徑 時必須使用絕對路徑,即如果如下寫法:
# -v 掛載時將 /app.jar 修改為 app.jar
docker run -dp 8859:8859 \
--name jenkins-demo \
-v ./jenkins-0.0.1-SNAPSHOT.jar:app.jar \
openjdk:11 \
java -jar /app.jar
會報錯:invalid mount config for type “bind”: invalid mount path: ‘a(chǎn)pp.jar’ mount path must be absolute.