文章目录
- 1. 现象描述
- 2. 错误原因
- 3. docker方面的解决
- 3.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
- 4. 其它
- 4.1 1000用户组
- 4.2 容器用户和宿主机用户
- ✅5. vscode remote-ssh的问题
1. 现象描述
在vscode中,打开服务器中和docker映射的volume的文件,修改保存时提示:permission denied
2. 错误原因
参考:Docker Volume 权限管理
是因为容器中目录权限和本地映射数据卷的权限不一致,本地映射目录权限要高于容器目录权限,所以映射到本地之后,没有写入的权限。
例如:同一个文件夹
在容器中是root
和1000
权限(对于普通文件都是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 chown -R 770 /data
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 command: 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 common: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
参考:
- (一)利用docker在linux服务器上部署tensorflow、pytorch等环境
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" volumes:- ./data/solr:/solr
类似的还有这个回答,Change permissions for named volumes in Docker
分别是在dockerfile里改,run的时候改,已经run起来之后的exec改。(我试了Option3,但是报错了,可能是我写的有什么问题,有成功的可以留个评论)
3.3 dockerfile
3.3.1 方法1 chown修改权限
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
之前改的是770,这里是757,看菜鸟教程-Linux 文件基本属性,所以其实不仅是文件属主的问题,还有文件的权限问题。
chmod 757 -R /datachmod 757 -R ./
所以说明我在容器里的身份其实是other。。(关于容器里的用户角色,以后需要补充。)