docker run 目錄掛載沒有反應 Error: Unable to access jarfile /xxx/xxx.jar

                              docker run 目錄掛載失敗

一、發現問題

    在使用docker java鏡像時發現使用docker run  命令啓動spring boot項目沒有反應命令如下:

    因爲對docker不太熟悉,但是公司又需要部署,所以我在自己的環境上對命令試了一下


docker run -d --rm -p 7061:7061 -v /legrand/apps/legrand-cloud:/opt --name register-server --net=host java:8 java -jar /opt/register-server-1.0.0.jar

 查看所有容器發現沒有剛剛啓動的呢個

[root@localhost /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost /]# 

然後分析了下上面呢段命令,去了後臺運行 -d

[root@localhost /]# sudo docker run  --rm -e TZ="Asia/Shanghai" -p 7061:7061 -v /legrand/apps/legrand-cloud:/opt --name register-server --net=host java:8 java -jar /opt/register-server-1.0.0.jar
Error: Unable to access jarfile /opt/register-server-1.0.0.jar

 運行後發現報 Error: Unable to access jarfile /opt/register-server-1.0.0.jar

 然後就解了下這邊的目錄掛載 也就是後半段  將/legrand/apps/legrand-cloud 掛載到 /opt目錄下

/legrand/apps/legrand-cloud:/opt

 二、解決方式

我在這裏說了三種解決方式,個人比較建議前兩種

 

第一種:猜測是不是權限出現了問題,就瞭解了下目錄掛載權限問題,並且找到了對應的命令

 #默認是false
--privileged=true

 

 

然後修改了下啓動命令發現就可以了

[root@localhost /]# docker run  --rm -e TZ="Asia/Shanghai" -p 7061:7061 -v /legrand/apps/legrand-cloud:/opt --name register-server --privileged=true --net=host java:8 java -jar /opt/register-server-1.0.0.jar

.........

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::       (v1.5.19.RELEASE)
.........

 然後再加上後臺運行

[root@localhost /]# docker run -d --rm -e TZ="Asia/Shanghai" -p 7061:7061 -v /legrand/apps/legrand-cloud:/opt --name register-server --privileged=true --net=host java:8 java -jar /opt/register-server-1.0.0.jar

再使用docker ps 命令查看

[root@localhost /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ea3d2837e030        java:8              "java -jar /opt/re..."   29 seconds ago      Up 29 seconds                           register-server

停止剛纔啓動的容器 

[root@localhost /]# docker stop register-server

 

 

第二種:後來又在文檔中發現了文件掛載時關於selinux的解決方式

需要在掛載的參數後面再追加一個參數 

 -v 本地目錄:掛載目錄:z

docker run -d --rm -p 7061:7061 -v /legrand/apps/legrand-cloud:/opt:z --name register-server --net=host java:8 java -jar xxxxxxxxx

 

 

 搞定

[root@localhost /]# docker run -d --rm -p 7061:7061 -v /legrand/apps/legrand-cloud:/opt:z --name register-server --net=host java:8 java -jar /opt/register-server-1.0.0.jar
6d465bea0b745778d40ea8cdd76f4f205e390fb64db5bc406413da999607a556
[root@localhost /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6d465bea0b74        java:8              "java -jar /opt/re..."   4 seconds ago       Up 3 seconds                            register-server
[root@localhost /]#

 

第三種: 關閉selinux 模塊

經過上面一系列操作後導致問題的原因也就付出水面了,然後我關閉了CentOS內置的selinux 策略,使用本文開頭第一個命令,發現可以正常啓動,最後確定就是 selinux 搞得鬼導致docker 運行時權限不足無法掛載到指定目錄。

分爲三步:

1.降低selinux  安全級別:setenforce 0

2.執行運行命令

3.恢復selinux到最高安全級別:setenforce 1

[root@localhost /]# setenforce 0
[root@localhost /]# docker run -d --rm -p 7061:7061 -v /legrand/apps/legrand-cloud:/opt --name register-server --net=host java:8 java -jar /opt/register-server-1.0.0.jar
d0f0a4bb239ce0768f00585e2e8f2856ba3e831aa39e3c36e198a849ab872971
[root@localhost /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d0f0a4bb239c        java:8              "java -jar /opt/re..."   4 seconds ago       Up 3 seconds                            register-server
[root@localhost /]# 

注意:也可以直接將selinux 永久關閉(生產環境不建議)

 selinux 的幾種關閉方式請查看 Selinux 簡單操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章