热门标签 | 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。。(关于容器里的用户角色,以后需要补充。)


推荐阅读
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了在RHEL 7中的系统日志管理和网络管理。系统日志管理包括rsyslog和systemd-journal两种日志服务,分别介绍了它们的特点、配置文件和日志查询方式。网络管理主要介绍了使用nmcli命令查看和配置网络接口的方法,包括查看网卡信息、添加、修改和删除配置文件等操作。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  •     这里使用自己编译的hadoop-2.7.0版本部署在windows上,记得几年前,部署hadoop需要借助于cygwin,还需要开启ssh服务,最近发现,原来不需要借助cy ... [详细]
  • Hadoop2.6.0 + 云centos +伪分布式只谈部署
    3.0.3玩不好,现将2.6.0tar.gz上传到usr,chmod-Rhadoop:hadophadoop-2.6.0,rm掉3.0.32.在etcp ... [详细]
  • linux 禁止指定ip访问
    linux中如何禁止指定的ip访问呢?比如被别人暴力破解,被别人使用不同的密码尝试登录:所以我想直接禁用这些ip的访问.怎么办呢?解决方案:修改配置文件etchosts.deny把 ... [详细]
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社区 版权所有