当前位置: 首页 > news >正文

Docker容器访问挂载文件权限问题

问题描述

在使用docker-compose部署项目时,yaml文件如下:

version: '3'
services:purchasing-contract-consumer:image: my-registry.com/consumer:latestenvironment:- TZ=Asia/Shanghai- app_env=prodrestart: alwaysworking_dir: /appcommand: python app.pyvolumes:- type: bindsource: /home/admin/deploy/consumer/application.logtarget: /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:latestenvironment:- TZ=Asia/Shanghai- app_env=prodrestart: alwaysworking_dir: /appcommand: python app.pyvolumes:-  /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: bindsource: /home/admin/deploy/consumer/application.logtarget: /app/application.log:Z #无效,容器无法修改宿主机上application.log的SELinux类型volumes:-  /home/admin/deploy/consumer/application.log:/app/application.log:Z #有效,容器成功修改宿主机上application.log的SELinux类型

文章转载自:曾彪彪

原文链接:Docker容器访问挂载文件权限问题 - 曾彪彪 - 博客园

体验地址:JNPF快速开发平台

http://www.dtcms.com/a/283218.html

相关文章:

  • MPPT电路设计
  • vue中后端返回数据流,前端实现导出下载
  • 等价关系与不变量
  • Web3:Solidity入门到精通
  • cdr序列化与反序列化
  • SenseGlove力反馈手套:医疗、生产制造、军事模拟与远程机器人控制新革命
  • 【AI交叉】化学:人工智能如何重塑现代化学研究?
  • 谷歌引入开源全栈 AI 代理栈:借助 Gemini 2.5 和 LangGraph 实现多步网络搜索、反思与综合
  • NMS代码详解(数据维度变换解析)
  • 格密码--Ring-SIS和Ring-LWE
  • 架构解密|一步步打造高可用的 JOCR OCR 识别服务
  • oracle会话控制和存储状态查询
  • pyqt当中splitter.setSizes()不生效
  • C++中vector和list的优缺点对比以及deque
  • PowerJob集群机器数为0问题
  • Python第八章作业(初级)
  • 如何使用VScode使用ssh连接远程服务器不需要输入密码直接登录
  • 27.Hamming 距离
  • transformers基础Data Collator
  • 教程:如何快速查询 A 股实时 K线和5档盘口
  • 今日行情明日机会——20250716
  • Redis深度解析:从缓存到分布式系统的核心引擎
  • 用python实现自动化布尔盲注
  • pytest--1--pytest-mock常用的方法
  • 代码随想录day36dp4
  • 震坤行获取商品SKU操作详解
  • 16路串口光纤通信FPGA项目实现指南
  • Kotlin获取集合中的元素操作
  • Java与Vue精心打造资产设备管理系统,提供源码,适配移动端与后台管理,助力企业高效掌控资产动态,提升管理效能
  • 【Java】JUC并发(synchronized进阶、ReentrantLock可重入锁)