文章目录

  • 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. 现象描述

docker compose不允许使用其他属性版本 docker-compose permission denied_linux


在vscode中,打开服务器中和docker映射的volume的文件,修改保存时提示:permission denied

2. 错误原因

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

例如:同一个文件夹

在容器中是root1000权限(对于普通文件都是1000权限)

docker compose不允许使用其他属性版本 docker-compose permission denied_redis_02


但是在服务器里就是user权限。

docker compose不允许使用其他属性版本 docker-compose permission denied_Docker_03

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 修改权限

"""
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
services:
  base:
    image: busybox
    user: root  # 指定user
  common:
    image: busybox
    extends:
      service: base
  cli:
    extends:
      service: common
  • 另外,还有一段话,点击这里
  • docker compose不允许使用其他属性版本 docker-compose permission denied_linux_04



4.2.3 应用方法1结果

还是会有些文件打不开。

docker compose不允许使用其他属性版本 docker-compose permission denied_容器_05


怀疑不是因为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

docker compose不允许使用其他属性版本 docker-compose permission denied_Docker_06


分别是在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


其它参考: