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

 更新时间:2025年02月18日 08:45:51   作者:曾彪彪  
在使用docker-compose部署项目时,因为SELinux策略导致容器无法访问宿主机上挂载的文件,解决方案包括禁用SELinux、修改文件类型为svirt_sandbox_file_t或使用:Z选项挂载文件,本文介绍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类型

示例代码在Gitee上同步

到此这篇关于Docker容器访问挂载文件权限问题的文章就介绍到这了,更多相关Docker容器访问挂载文件权限问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker自建GitLab仓库的实现

    docker自建GitLab仓库的实现

    Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,本文主要介绍了docker自建GitLab仓库的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • 关于docker容器优雅退出的问题详解

    关于docker容器优雅退出的问题详解

    在Docker大火的今天,我们能够非常方便的使用容器打包我们的应用程序,并且将它在我们的服务器上部署并运行起来。而下面这篇文章主要给大家介绍了关于docker容器如何优雅退出的问题,需要的朋友可以参考下。
    2017-09-09
  • CentOS7 阿里云的yum源使用详解

    CentOS7 阿里云的yum源使用详解

    这篇文章主要介绍了CentOS7 阿里云的yum源使用详解的相关资料,这里对备份yum源,添加EPEL源,和缓存清理,进行了介绍,需要的朋友可以参考下
    2016-11-11
  • iptables如何限制宿主机跟Docker IP和端口访问(安全整改)

    iptables如何限制宿主机跟Docker IP和端口访问(安全整改)

    本文详细介绍了如何通过iptables对网络访问进行限制,包括限制特定IP或网段访问特定服务,以及在Docker环境下,如何设置DOCKER-USER链限制IP和端口访问,确保网络安全
    2024-10-10
  • docker对网络和程序速度的影响解读

    docker对网络和程序速度的影响解读

    本文通过对比分析,测试了在宿主机和Docker容器中部署Spring Boot程序的性能差异,在网络延迟方面,Docker容器比宿主机慢0.1~0.2毫秒,在程序运行速度方面,宿主机和Docker容器的平均运行时间相近,单次运行时间存在较大差异,无法确定Docker容器在速度上优于宿主机
    2025-01-01
  • docker之如何设置日志文件大小及个数

    docker之如何设置日志文件大小及个数

    这篇文章主要介绍了docker之如何设置日志文件大小及个数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 详解docker私有仓库搭建与使用实战

    详解docker私有仓库搭建与使用实战

    这篇文章主要介绍了详解docker私有仓库搭建与使用实战,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • Docker安装jenkins实现微服务多模块打包的示例代码

    Docker安装jenkins实现微服务多模块打包的示例代码

    本文主要介绍了Docker安装jenkins实现微服务多模块打包的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Docker 端口映射详细介绍

    Docker 端口映射详细介绍

    这篇文章主要介绍了Docker 端口映射详细介绍的相关资料,需要的朋友可以参考下
    2016-10-10
  • Docker守护进程安全配置项目详解

    Docker守护进程安全配置项目详解

    这篇文章主要介绍了Docker守护进程安全配置介绍,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论