文章目录
- 1. 现象描述
- 2. 错误原因
- 3. 解决方式
- 4. 其他尝试
- 4.1 单次解决
- 4.1.1 ❌方法1 修改权限
- 4.2 在dockercompose.yml中添加配置修改权限
- 4.2.1 神奇的参数
- ✅4.2.2 方法1,添加user参数
- 4.2.3 应用方法1结果
- 4.2.4 方法2,添加privileged: true
- 4.3.5 方法3, 添加chown语句
- 4.3 dockerfile
- 4.3.1 方法1 chown修改权限
- 4.4 用户组
- 4.4.1 1000用户组
- 4.4.2 容器用户和宿主机用户
1. 现象描述
在vscode中,打开服务器中和docker映射的volume的文件,修改保存时提示:permission denied
2. 错误原因
是因为容器中目录权限和本地映射数据卷的权限不一致,本地映射目录权限要高于容器目录权限,所以映射到本地之后,没有写入的权限。
例如:同一个文件夹
在容器中是root
和1000
权限(对于普通文件都是1000权限)
但是在服务器里就是user
权限。
3. 解决方式
之前的报错信息
未能保存“XXX.py”: 无法写入文件"vscode-remote://ssh-remote+XXXX.py"
(NoPermissions (FileSystemError): Error: EACCES: permission denied, open
'XXXX')
也是修改文件权限
chmod 757 xxx #“xxx”为文件名,这样就可以远程修改了。
之前改的是770,这里是757,看菜鸟教程-Linux 文件基本属性,所以其实不仅是文件属主的问题,还有文件的权限问题。
chmod 757 -R /data
chmod 757 -R ./
所以说明我在容器里的身份其实是other。。(关于容器里的用户角色,以后需要补充。)
4. 其他尝试
4.1 单次解决
适用于容器已经在运行中,volume已经挂载的情况
假设我的docker-compose.yml中关于数据挂载是
volumes:
- /data:/data
4.1.1 ❌方法1 修改权限
- 关于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
4.2 在dockercompose.yml中添加配置修改权限
适用于容器还没有启动,还在写配置文件的过程
4.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
✅4.2.2 方法1,添加user参数
version: '2'
services:
logstash:
image: docker.elastic.co/logstash/logstash:6.4.2
user: root # 在镜像下面添加user:root
command: id
- 参考:Compose file version 3 reference,在页面中搜索
user
(第5个user附近)
可以看到以下内容,说明在创建容器的时候,确实是可以指定一些权限的
version: "3.9"
services:
redis:
image: redis:latest
deploy:
replicas: 1
secrets:
- source: my_secret
target: redis_secret
uid: '103'
gid: '103'
mode: 0440
- 参考Compose specification,同样在这个页面搜索
user
(第19个user附近),也可以看到
services:
base:
image: busybox
user: root # 指定user
common:
image: busybox
extends:
service: base
cli:
extends:
service: common
- 另外,还有一段话,点击这里
4.2.3 应用方法1结果
还是会有些文件打不开。
怀疑不是因为docker-compose的原因,随转向vscode的remote-ssh问题,后续请看 5. vscode remote-ssh的问题部分
4.2.4 方法2,添加privileged: true
version: '3'
services:
redis:
image: redis:alpine
container_name: sc-redis
restart: always
privileged: true
参考:
- (一)利用docker在linux服务器上部署tensorflow、pytorch等环境
- 考虑privilege
4.3.5 方法3, 添加chown语句
根据Docker persisted volum has no permissions (Apache Solr)
version: "3"
services:
initializer:
image: alpine
container_name: solr-initializer
restart: "no"
entrypoint: |
/bin/sh -c "chown 8983:8983 /solr" # 在容器启动的时候执行chown
volumes:
- ./data/solr:/solr
类似的还有这个回答,Change permissions for named volumes in Docker
分别是在dockerfile里改,run的时候改,已经run起来之后的exec改。(我试了Option3,但是报错了,可能是我写的有什么问题,有成功的可以留个评论)
4.3 dockerfile
4.3.1 方法1 chown修改权限
RUN chown root:root -R /data
- 这部分写法和3.1 的方法1类似
4.4 用户组
4.4.1 1000用户组
TBD
4.4.2 容器用户和宿主机用户
TBD
其它参考:
- Docker (compose) Permission denied
- 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