热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

dockercompose的volume写文件提示Permissiondenied

文章目录1.现象描述2.错误原因3.docker方面的解决3.1单次解决3.1.1❌方法1修改权限3.2在dockercompose.yml中添加配置修改权限3.2.1神奇的参数✅

文章目录

  • 1. 现象描述
  • 2. 错误原因
  • 3. docker方面的解决
    • 3.1 单次解决
      • 3.1.1 ❌方法1 修改权限
    • 3.2 在dockercompose.yml中添加配置修改权限
      • 3.2.1 神奇的参数
      • ✅3.2.2 方法1,添加user参数
      • 3.2.3 应用方法1结果
      • 3.2.4 方法2,添加privileged: true
      • 3.3.5 方法3, 添加chown语句
    • 3.3 dockerfile
      • 3.3.1 方法1 chown修改权限
  • 4. 其它
    • 4.1 1000用户组
    • 4.2 容器用户和宿主机用户
  • ✅5. vscode remote-ssh的问题


1. 现象描述

在这里插入图片描述
在vscode中,打开服务器中和docker映射的volume的文件,修改保存时提示:permission denied

2. 错误原因

参考:Docker Volume 权限管理

是因为容器中目录权限和本地映射数据卷的权限不一致,本地映射目录权限要高于容器目录权限,所以映射到本地之后,没有写入的权限。

例如:同一个文件夹

在容器中是root1000权限(对于普通文件都是1000权限)
在这里插入图片描述
但是在服务器里就是user权限。
在这里插入图片描述

3. docker方面的解决

3.1 单次解决

适用于容器已经在运行中,volume已经挂载的情况

假设我的docker-compose.yml中关于数据挂载是

volumes: - /data:/data



3.1.1 ❌方法1 修改权限


  • 参考CSDN博客:关于docker-compose的volume映射发生Permission denied的解决及评论。
  • 关于linux修改文件权限/属主,可以参考菜鸟教程-Linux 文件基本属性

"""
1. 直接修改对应的volume在容器里的权限,在容器里执行以下
"""
chown root -R /data # 让容器里的`/data`文件夹提高权限chown -R 770 /data # 修改这个volume的属组和属主的读写权限# 提示以下内容,修改失败,不能这么改
chown: changing ownership of '/data/XXX/docker_data_root/overlay2/XXX/merged/sys': Read-only file system
chown: WARNING: Circular directory structure.
This almost certainly means that you have a corrupted file system.
NOTIFY YOUR SYSTEM MANAGER.
The following directory is part of the cycle:/data/XXX/docker_data_root/overlay2/XXXX/merged/data/data3/docker_data_root/overlay2/XXXX/merged

3.2 在dockercompose.yml中添加配置修改权限

适用于容器还没有启动,还在写配置文件的过程

3.2.1 神奇的参数

参考github的issue:Docker-compose volumes give permission denied after upgrade to moby.,提示

Add :Z to your volumes mounts: /host/path:/container/path:Z and it should work.

这样做的依据来自于:Using Volumes with Docker can Cause Problems with SELinux

  • 想要看完整的信息,可以man docker run,或者看这个网页
  • 主要是 volume中-z参数的使用
    在这里插入图片描述
    下面这部分是重点描述
    在这里插入图片描述
    可以简单理解为,有了这个Z参数,那么就可以在多个容器间共享volume

✅3.2.2 方法1,添加user参数


  • 参考Logstash6.4.2 started by using docker-compose up, an error occurred: UDP listener died , Permission denied

    version: '2'
    services:logstash:image: docker.elastic.co/logstash/logstash:6.4.2user: root # 在镜像下面添加user:rootcommand: id

  • 参考:Compose file version 3 reference,在页面中搜索user(第5个user附近)
    可以看到以下内容,说明在创建容器的时候,确实是可以指定一些权限的

    version: "3.9"
    services:redis:image: redis:latestdeploy:replicas: 1secrets:- source: my_secrettarget: redis_secretuid: '103'gid: '103'mode: 0440

  • 参考Compose specification,同样在这个页面搜索user(第19个user附近),也可以看到

    services:base:image: busyboxuser: root # 指定usercommon:image: busyboxextends:service: basecli:extends:service: common

  • 另外,还有一段话,点击这里
    在这里插入图片描述



3.2.3 应用方法1结果

还是会有些文件打不开。
在这里插入图片描述
怀疑不是因为docker-compose的原因,随转向vscode的remote-ssh问题,后续请看 5. vscode remote-ssh的问题部分

3.2.4 方法2,添加privileged: true


  • 参考CSDN博客:关于docker-compose的volume映射发生Permission denied的解决

    version: '3'
    services:redis: image: redis:alpinecontainer_name: sc-redisrestart: alwaysprivileged: true



参考:

  • (一)利用docker在linux服务器上部署tensorflow、pytorch等环境
    • 考虑privilege

3.3.5 方法3, 添加chown语句

根据Docker persisted volum has no permissions (Apache Solr)

version: "3"
services:initializer:image: alpinecontainer_name: solr-initializerrestart: "no"entrypoint: |/bin/sh -c "chown 8983:8983 /solr" # 在容器启动的时候执行chownvolumes:- ./data/solr:/solr

类似的还有这个回答,Change permissions for named volumes in Docker
在这里插入图片描述
分别是在dockerfile里改,run的时候改,已经run起来之后的exec改。(我试了Option3,但是报错了,可能是我写的有什么问题,有成功的可以留个评论)



3.3 dockerfile


3.3.1 方法1 chown修改权限


  • 参考Stack Oveflow:Permission changed to 1000 on local host after Docker container with volume created

    RUN chown root:root -R /data
    这部分写法和3.1 的方法1类似


4. 其它

4.1 1000用户组

TBD

4.2 容器用户和宿主机用户

TBD


其它参考:

  • CSDN博客:Docker容器中root用户权限变成1000用户的权限
  • Docker (compose) Permission denied
  • CSDN博客:Docker Volume 权限管理
  • 博客园博客:docker挂载volume的用户权限问题,理解docker容器的uid
  • Docker and the Host Filesystem Owner Matching Problem
  • Handling File Permissions When Writing to Volumes from #Docker Containers
  • Change permissions for named volumes in Docker

✅5. vscode remote-ssh的问题

之前的报错信息

未能保存“XXX.py”: 无法写入文件"vscode-remote://ssh-remote+XXXX.py"
(NoPermissions (FileSystemError): Error: EACCES: permission denied, open
'XXXX')

参考:vscode-remote 无法写入文件“vscode-remote://ssh-remote

也是修改文件权限

chmod 757 xxx #“xxx”为文件名,这样就可以远程修改了。

之前改的是770,这里是757,看菜鸟教程-Linux 文件基本属性,所以其实不仅是文件属主的问题,还有文件的权限问题。

chmod 757 -R /datachmod 757 -R ./

所以说明我在容器里的身份其实是other。。(关于容器里的用户角色,以后需要补充。)


推荐阅读
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 本文介绍了 Linux 系统中用于定期执行任务的 cron 服务及其配置方法。通过 crond 和 crontab 命令,用户可以轻松地安排系统和用户级别的周期性任务。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 在本文中,我们将探讨如何在Docker环境中高效地管理和利用数据库。首先,需要安装Docker Desktop以确保本地环境准备就绪。接下来,可以从Docker Hub中选择合适的数据库镜像,并通过简单的命令将其拉取到本地。此外,我们还将介绍如何配置和优化这些数据库容器,以实现最佳性能和安全性。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
author-avatar
Adam_phper
与时俱进
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有