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:70...
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 简单操作
更多推荐
所有评论(0)