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 簡單操作