问题描述

在使用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容器访问挂载文件权限问题的更多相关文章

  1. docker容器修改hosts文件,重启失效问题解决

    docker容器修改hosts文件 搜了一大批资料,有说需要在docker run --hosts...改:dockerfile改:有点麻烦,下面方案比较好: 参照docker吧(https://ti ...

  2. 无需安装 vsftpd , 直接使用 FTP 来管理 docker 容器中的文件

    无图无真相,先放个效果图:     背景 使用 docker 来跑一些服务很方便,但是有的时候想管理容器里面的文件却很麻烦 -- 一般常规做法有3种: 通过数据卷或数据卷容器的方式 启动容器的时候时候 ...

  3. centos:解决docker容器内挂载目录无权限 ls: cannot open directory .: Permission denied

    docker运行一个容器后,将主机中当前目录下的文件夹挂载到容器的文件夹后 进入到docker容器内对应的挂载目录中,运行命令ls后提示: ls: cannot open directory .: P ...

  4. windows宿主机和docker容器设置挂载共享文件夹

    docker容器内的程序经常需要访问.调用宿主机目录中的数据,每次都要导入导出非常麻烦费力. 接下来,一步步实现将宿主机的指定文件夹挂载到docker容器中. 1. 打开Oracle VM Vitua ...

  5. 关于docker容器访问的主机的端口问题

    docker容器需要访问主机的,不能使用127.0.0.1,127.0.0.1访问的是docker容器不是主机: docker容器创建时会分配一个主机ip,可在主机使用命令 docker inspec ...

  6. 编辑docker容器中的文件

    一般docker中没有VI或者其它相应的文本编辑器,为了写个东西安装个vi就可以解决问题,除此之外还有别的办法 登陆docker中找到需要编辑的文件的位置 sudo docker ps -a sudo ...

  7. docker创建mysql容器时挂载文件路径后无法启动(已解决)

    系统centos7 docker版本: 解决方法: 在docker run中加入 --privileged=true  给容器加上特定权限,如下 docker run --privileged=tru ...

  8. docker容器中日志文件过大处理方法

    背景 :在日常工作中一个基于centos镜像构建起来的python爬虫程序,日志文件在两个月内到了500G,日志存放在根目录下面,在不扩容的情况下把这个问题给解决掉.通过定时任务和脚本的方法,定期的清 ...

  9. docker容器内修改文件

    1.找到容器对应的ID 使用docker ps命令找到对应的镜像id 2.根据容器id进入到对应文件夹 执行命令:docker exec -it 镜像id /bin/bash 3.进入对应目录(以My ...

  10. docker 容器目录挂载 | 进出容器

    docker run --name wnginx -d -p 9001:80 -v /home/www:/usr/share/nginx/html nginx --name   别名 -d      ...

随机推荐

  1. spring cloud 使用nacos 作为配置中心

    概要 nacos 可以作为服务注册发现中心,也可以作为配置中心,作为配置中心的时候,系统的配置可以做到自动刷新,即当配置服务器的数据发生更改时,客户端的配置会进行自动的更新. 实现步骤 1.修改mav ...

  2. C/C++源码扫描系列- Fortify 篇

    首发于 https://xz.aliyun.com/t/9276 概述 Fortify是一款商业级的源码扫描工具,其工作原理和codeql类似,甚至一些规则编写的语法都很相似,其工作示意图如下: 首先 ...

  3. StarBlog博客Vue前端开发笔记:(4)使用FontAwesome图标库

    前言 在现代前端开发中,图标已成为构建用户友好界面的重要元素.Font Awesome 是全球最流行的图标库之一,提供了大量的矢量图标,支持多种平台和框架.无论是网站.应用程序,还是管理面板,Font ...

  4. 腾讯云TKE-PV使用COS存储案例:容器目录权限问题

    背景 在TKE的集群中创建工作负载并把某一个对应的cos桶的根目录挂载到/data目录,在镜像构建的时候有把/data目录设置权限为755,但是运行容器后成功挂载cos桶的根目录到/data/目录,发 ...

  5. 动态 import()

    动态 import() https://v8.dev/features/dynamic-import Dynamic import() 引入了一个新的类似函数的功能,相比静态的 import 提供了新 ...

  6. 【机器学习】SVM(支持向量机)算法实验

    (一)实验名称:SVM(支持向量机)算法实验 (二)实验目的: 学习支持向量机SVM的基本概念 了解核函数的基本概念 掌握使用scikit-learn API函数实现SVM算法 (三)实验内容:使用s ...

  7. Qt音视频开发27-ffmpeg视频旋转显示

    一.前言 用手机或者平板拍摄的视频文件,很可能是旋转的,比如分辨率是1280x720,确是垂直的,相当于分辨率变成了720x1280,如果不做旋转处理的话,那脑袋必须歪着看才行,这样看起来太难受,所以 ...

  8. Vue cli 2.x 3.x及4.x区别

    原文链接: 1.Vue cli 2.x 3.x及4.x区别 2.vue-cli2.0/3.0/4.0创建项目的方式差异解读和vue-cli4.0打包命令和环境配置

  9. [转]OpenLayer4地图全屏的实现

    第一种方式:自实现 1.首先将地图容器的长宽设置成100%. 2.对form 和body标签长宽设置成100%. 3.对浏览器进行全屏设置. 具体代码如下所示(fullextent 为全屏安全ID.) ...

  10. Java中使用JFreeChart生成甘特图

    引言 甘特图是一种流行的项目管理工具,用于显示项目的进度和任务分配.它通过条形图显示任务的开始和结束时间,使项目经理能够直观地了解项目的整体情况.在Java开发中,JFreeChart是一个强大的开源 ...