Docker容器访问挂载文件权限问题
问题描述
在使用docker-compose部署项目时,yaml文件如下:
version: '3'
services:
purchasing-contract-consumer:
image: my-registry.com/consumer:latest
environment:
- TZ=Asia/Shanghai
- app_env=prod
restart: always
working_dir: /app
command: python app.py
volumes:
- type: bind
source: /home/admin/deploy/consumer/application.log
target: /app/application.log
启动应用时,报错:
PermissionError: [Errno 13] Permission denied: '/app/application.log'
原因分析
在我的应用中,需要在容器中对application.log文件进行写入,这个文件被挂载到宿主机上。因为我的宿主机系统是CentOS,默认启用了SELinux。在SELinux策略下,容器进程的类型是container_t类型,而宿主机上的文件默认是user_home_t类型,二者类型不匹配,容器进程无法访问宿主机上挂载的文件。
解决方案
方案1,禁用SELinux,不推荐。
临时禁用SELinux方案如下:
sudo setenforce 0
方案2,在宿主机上修改application.log文件类型为svirt_sandbox_file_t
chcon -t svirt_sandbox_file_t application.log
如果需要永久修改application.log文件类型
semanage fcontext -a -t svirt_sandbox_file_t "application.log"
restorecon application.log
将文件类型修改成svirt_sandbox_file_t之后,因为docker容器进程是container_t类型,SELinux允许container_t类型的进程访问svirt_sandbox_file_t类型的文件。
方案3,挂载时使用:Z,这将把挂载的文件设置成container_file_t类型,确保容器进程可以访问挂载文件。更新后的yaml文件如下。(推荐)
version: '3'
services:
purchasing-contract-consumer:
image: my-registry.com/consumer:latest
environment:
- TZ=Asia/Shanghai
- app_env=prod
restart: always
working_dir: /app
command: python app.py
volumes:
- /home/admin/deploy/consumer/application.log:/app/application.log:Z
运行后,查看SELinux上下文类型
[admin@myhost consumer]$ ls -lZ
-rw-rw-r--. admin admin system_u:object_r:container_file_t:s0:c716,c748 application.log
drwxr-xr-x. root root system_u:object_r:container_file_t:s0:c97,c362 config
-rwxr-xr-x. admin admin unconfined_u:object_r:user_home_t:s0 docker-compose.yml
-rw-rw-r--. admin admin unconfined_u:object_r:user_home_t:s0 qtsb-mail.tar
-rwxrwxr-x. admin admin unconfined_u:object_r:user_home_t:s0 start.sh
使用:Z挂载的文件类型是container_file_t,可以被容器进程访问。默认文件类型是user_home_t,无法被容器进程访问。
在使用方案3解决问题时,不能显示指定bing mount。如下
volumes:
- type: bind
source: /home/admin/deploy/consumer/application.log
target: /app/application.log:Z #无效,容器无法修改宿主机上application.log的SELinux类型
volumes:
- /home/admin/deploy/consumer/application.log:/app/application.log:Z #有效,容器成功修改宿主机上application.log的SELinux类型
Docker容器访问挂载文件权限问题的更多相关文章
- docker容器修改hosts文件,重启失效问题解决
docker容器修改hosts文件 搜了一大批资料,有说需要在docker run --hosts...改:dockerfile改:有点麻烦,下面方案比较好: 参照docker吧(https://ti ...
- 无需安装 vsftpd , 直接使用 FTP 来管理 docker 容器中的文件
无图无真相,先放个效果图: 背景 使用 docker 来跑一些服务很方便,但是有的时候想管理容器里面的文件却很麻烦 -- 一般常规做法有3种: 通过数据卷或数据卷容器的方式 启动容器的时候时候 ...
- centos:解决docker容器内挂载目录无权限 ls: cannot open directory .: Permission denied
docker运行一个容器后,将主机中当前目录下的文件夹挂载到容器的文件夹后 进入到docker容器内对应的挂载目录中,运行命令ls后提示: ls: cannot open directory .: P ...
- windows宿主机和docker容器设置挂载共享文件夹
docker容器内的程序经常需要访问.调用宿主机目录中的数据,每次都要导入导出非常麻烦费力. 接下来,一步步实现将宿主机的指定文件夹挂载到docker容器中. 1. 打开Oracle VM Vitua ...
- 关于docker容器访问的主机的端口问题
docker容器需要访问主机的,不能使用127.0.0.1,127.0.0.1访问的是docker容器不是主机: docker容器创建时会分配一个主机ip,可在主机使用命令 docker inspec ...
- 编辑docker容器中的文件
一般docker中没有VI或者其它相应的文本编辑器,为了写个东西安装个vi就可以解决问题,除此之外还有别的办法 登陆docker中找到需要编辑的文件的位置 sudo docker ps -a sudo ...
- docker创建mysql容器时挂载文件路径后无法启动(已解决)
系统centos7 docker版本: 解决方法: 在docker run中加入 --privileged=true 给容器加上特定权限,如下 docker run --privileged=tru ...
- docker容器中日志文件过大处理方法
背景 :在日常工作中一个基于centos镜像构建起来的python爬虫程序,日志文件在两个月内到了500G,日志存放在根目录下面,在不扩容的情况下把这个问题给解决掉.通过定时任务和脚本的方法,定期的清 ...
- docker容器内修改文件
1.找到容器对应的ID 使用docker ps命令找到对应的镜像id 2.根据容器id进入到对应文件夹 执行命令:docker exec -it 镜像id /bin/bash 3.进入对应目录(以My ...
- docker 容器目录挂载 | 进出容器
docker run --name wnginx -d -p 9001:80 -v /home/www:/usr/share/nginx/html nginx --name 别名 -d ...
随机推荐
- Pwn2own 2022 Tesla 利用链 (ConnMan 堆越界写 RCE)
Pwn2own 2022 Tesla 利用链 (ConnMan 堆越界写 RCE) Opening the doors and windows 0-click RCE on the Tesla Mod ...
- PCB设计AD规则设置(按照嘉立创设置)
本文转载自https://blog.csdn.net/subtitle_/article/details/121648972 官方参考https://www.jlc.com/portal/vtechn ...
- .NET周刊【12月第2期 2024-12-08】
国内文章 终于解决了.net在线客服系统总是被360误报的问题(对软件进行数字签名) https://www.cnblogs.com/sheng_chao/p/18581139 升讯威在线客服与营销系 ...
- 中电金信:零售经营“新赛道” ——基于手机银行APP专区调研的客群精细化运营分析报告
随着银行业竞争的不断深入及新客户增量日渐"到顶",各家银行的客群竞争逐渐由"跑马圈地"进入"精耕细作"的新阶段,在客群精准化服务方面不断深 ...
- 浅聊web前端性能测试
最近正好在做web前端的性能测试,这次就来聊聊关于这个的测试思路~ 首先从用户的思维去思考,关于web前端性能,用户最看重的是什么...... 其实就是下面三个点: 1. 加载性能(即页面加载时间+资 ...
- [sa-token]StpUtil.getLoginId
闲聊 一般情况下,我们想用uid,可能需要前端将uid传过来,或者将token传来,然后我们进行识别. 用了sa-token之后,可以使用StpUtil.getLoginId()方法获取当前会话的用户 ...
- 提供Chrome浏览器插件网站
提供Chrome浏览器插件网站: 1.收藏猫插件 2.极简插件
- Redis 源码简洁剖析 01 - 环境配置
fork Redis 源码 在 GitHub 上找到并 fork Redis 源码 https://github.com/redis/redis,然后在本地 clone 自己 fork 出来的源码项目 ...
- 搭建gitlab私有仓库
1.下载gitlab 首先在 /etc/yum.repos.d/目录下配置gitlab下载镜像源. # 进入目录 /etc/yum.repos.d/ cd /etc/yum.repos.d/ # 创建 ...
- Android基础入门教程-参考资料
2)看视频 网上关于Android的视频教程有很多,这里分享下基神力荐的黑马教程吧: 黑马28期Android全套视频无加密完整版:密码:h7jz 52期不加密版:密码:zve8 当然下面这些视频学习 ...