zoukankan      html  css  js  c++  java
  • Docker -v 对挂载的目录没有权限 Permission denied

    1.问题

    今天在使用docker挂载redis的时候老是报错

    docker run -v /home/redis/redis.conf:/usr/local/etc/redis/redis.conf --name redis2 -p 6378:6379 redis redis-server /usr/local/etc/redis/redis.conf
    

    然后一直报错:

    Fatal error, can't open config file '/usr/redis/redis.conf'
    

    2.排查过程

    查看日志也是这样
    然后我把使用配置文件的地方去掉

    docker run -v /home/redis/redis.conf:/usr/local/etc/redis/redis.conf --name redis2 -p 6378:6379 redis
    

    然后进入容器

    docker exec -it redis2 /bin/bash
    

    然后进入挂载的文件夹下

    cd /usr/local/etc/redis
    

    发现报错:

    cannot open directory '.': Permission denied
    

    也就是没有权限

    3.原因以及解决方案

    3.1 原因

    centos7中安全模块selinux把权限禁掉了

    3.2解决方案

    有三种方法解决:

    1. 在运行时加 --privileged=true
    docker run -v /home/redis/redis.conf:/usr/local/etc/redis/redis.conf --name redis2 --privileged=true redis  redis-server /usr/local/etc/redis/redis.conf
    

    2.临时关闭selinux然后再打开

    [root@localhost tomcat]# setenforce 0
    [root@localhost tomcat]# setenforce 1
    

    3.添加linux规则,把要挂载的目录添加到selinux白名单

    更改安全性文本的格式如下

    chcon [-R] [-t type] [-u user] [-r role] 文件或者目录
    
    选顷不参数: 
    -R  :该目录下的所有目录也同时修改; 
    -t  :后面接安全性本文的类型字段,例如 httpd_sys_content_t ; 
    -u  :后面接身份识别,例如 system_u; 
    -r  :后面街觇色,例如 system_r
    

    执行:

    chcon -Rt svirt_sandbox_file_t /home/redis/redis.conf
    

    4.关于docker挂载的一些经验

    4.1 容器目录不可以为相对路径

    4.2 宿主机目录如果不存在,则会自动生成

    4.3 宿主机的目录如果为相对路径呢

    可以通过docker inspect命令,查看容器“Mounts”那一部分,我们可以得到这个问题的答案。

  • 相关阅读:
    今天解决了一个很郁闷的问题!
    解决了安装golive后html文件图标显示错误的问题
    [转载]Asp.Net 2.0 发布问题
    使用 Visual Studio 2005 构建“WPFE”项目
    Ajax学习网址备忘录
    [原创首发]深圳博客问测系统正式发布啦!
    如何在用户控件里联动Dropdownlist
    [转载]在ASP.NET中值得注意的两个地方
    [转]Prototype 1.5 Ajax 使用教程
    1038 Recover the Smallest Number (30 分)(贪心)
  • 原文地址:https://www.cnblogs.com/smiler/p/10302975.html
Copyright © 2011-2022 走看看