标签 -v 下的文章

Docker | -v 对挂载的目录没有权限 Permission denied


情况

今天用docker部署jenkins的时候碰到问题了,挂载的目录权限出现了问题。本人的解决办法是临时关闭selinux即可

报错代码

touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?

问题所在

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

jenkins的composer

version: "3"
services:
  jenkins:
    build: .
    container_name: jenkins
    ports:
      - "8083:8080"
    volumes:
      - "/home/jenkins:/var/jenkins_home"
    image: jenkins/jenkins:lts
    restart: always

处理流程

  1. 先不添加挂载的情况查看一下文件需要的用户权限是啥,这里显示的是jenkins:jenkins
    屏幕截图 2023-06-28 105338.jpg
  2. 心思直接赋上1000的权限,才发现容器内外权限不能通用
  3. 临时禁用selinux
setenforce 0
  1. 启动jenkins容器即可

四种解决方案

1.在运行时加 --privileged=true

docker run -d -p 8083:8080 -v /home/jenkins:/var/jenkins_home --privileged=true --name jenkins jenkins/jenkins:lts

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

[root@localhost home]# setenforce 0
[root@localhost home]# docker start jenkins
[root@localhost home]# setenforce 1

3.永久关闭selinux,修改/etc/selinux/config

SELINUX=enforcing
改为
SELINUX=disabled

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

chcon -Rt svirt_sandbox_file_t /home/jenkins/

chcon命令简介

chcon命令 是修改对象(文件)的安全上下文,比如:用户、角色、类型、安全级别。也就是将每个文件的安全环境变更至指定环境。使用--reference选项时,把指定文件的安全环境设置为与参考文件相同。chcon命令位于/usr/bin/chcon。

语法

chcon [选项]... 环境 文件...
chcon [选项]... [-u 用户] [-r 角色] [-l 范围] [-t 类型] 文件...
chcon [选项]... --reference=参考文件 文件...

选项

-h, --no-dereference:影响符号连接而非引用的文件。

--reference=参考文件:使用指定参考文件的安全环境,而非指定值。

-R, --recursive:递归处理所有的文件及子目录。
-v, --verbose:为处理的所有文件显示诊断信息。
-u, --user=用户:设置指定用户的目标安全环境。
-r, --role=角色:设置指定角色的目标安全环境。
-t, --type=类型:设置指定类型的目标安全环境。
-l, --range=范围:设置指定范围的目标安全环境。

以下选项是在指定了-R选项时被用于设置如何穿越目录结构体系。如果您指定了多于一个选项,那么只有最后一个会生效。

-H:如果命令行参数是一个通到目录的符号链接,则遍历符号链接。
-L:遍历每一个遇到的通到目录的符号链接。
-P:不遍历任何符号链接(默认)。
--help:显示此帮助信息并退出。
--version:显示版本信息并退出。