Docker挂载CIFS卷写入文件时出现Permission denied问题求助
Docker挂载Samba共享卷权限问题排查与解决
我需要通过Docker Compose部署Spark主节点、工作节点和Almond Jupyter服务器,让三者都能读写挂载的Samba共享卷。处理的是公开数据,已经尝试过提升容器权限、禁用安全特性等操作,但在Almond Notebook中写入卷时仍提示Permission denied错误。
Docker Compose配置
services: spark: image: docker.io/bitnami/spark:3.5.2 user: root environment: - SPARK_MODE=master - SPARK_RPC_AUTHENTICATION_ENABLED=no - SPARK_RPC_ENCRYPTION_ENABLED=no - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no - SPARK_SSL_ENABLED=no - SPARK_USER=spark ports: - '8080:8080' - '7077:7077' volumes: - .:/main/workspace - cifs-volume:/main/data security_opt: - label:disable - seccomp:unconfined - apparmor:unconfined cap_add: - ALL privileged: true spark-worker: image: docker.io/bitnami/spark:3.5.2 user: root deploy: replicas: ${N_REPLICAS} environment: - SPARK_MODE=worker - SPARK_MASTER_URL=$SPARK_MASTER_URL - SPARK_RPC_AUTHENTICATION_ENABLED=no - SPARK_RPC_ENCRYPTION_ENABLED=no - SPARK_WORKER_MEMORY=$MEMORY - SPARK_EXECUTOR_MEMORY=$MEMORY - SPARK_WORKER_CORES=$N_CORES - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no - SPARK_SSL_ENABLED=no - SPARK_USER=spark volumes: - .:/main/workspace - cifs-volume:/main/data security_opt: - label:disable - seccomp:unconfined - apparmor:unconfined cap_add: - ALL privileged: true almond: image: almondsh/almond:latest user: root ports: - 8002:8888 environment: - JUPYTER_TOKEN=almond volumes: - .:/main/workspace - cifs-volume:/main/data security_opt: - label:disable - seccomp:unconfined - apparmor:unconfined cap_add: - ALL privileged: true volumes: cifs-volume: driver_opts: type: cifs o: username=${SMB_USER},password=${SMB_PASSWORD},uid=1000,gid-1000,vers=3.0,rw device: ${SMB_URL}
测试代码(Scala)
import scala.io.Source val fileContent = "Hello, World!" val filePath = "/main/data/file.txt" val file = new java.io.File(filePath) file.createNewFile()
报错信息
java.io.IOException: Permission denied java.io.UnixFileSystem.createFileExclusively(Native Method) java.io.File.createNewFile(File.java:1023) ammonite.$sess.cmd2$Helper.<init>(cmd2.sc:8) ammonite.$sess.cmd2$.<init>(cmd2.sc:7) ammonite.$sess.cmd2$.<clinit>(cmd2.sc:-1)
目录权限检查
执行ls -l /main得到以下输出:
total 4 drwxr-xr-x 2 1021 users 0 Dec 13 12:17 data drwxrwxr-x 4 1002 1002 4096 Dec 14 11:20 workspace
问题分析与解决步骤
1. 挂载参数拼写错误
从目录权限可以看到/main/data的属主是UID 1021,而你的CIFS挂载参数中gid-1000是拼写错误,正确写法应为gid=1000。这个错误导致挂载时未正确设置组ID,同时UID设置为1000与实际目录属主不匹配,即使容器用root用户运行,Samba共享的权限限制仍会阻止写入。
2. 修正挂载配置
修改volumes下的cifs-volume配置,修复拼写错误并添加公开数据所需的全权限参数:
volumes: cifs-volume: driver_opts: type: cifs o: username=${SMB_USER},password=${SMB_PASSWORD},uid=1000,gid=1000,vers=3.0,rw,file_mode=0777,dir_mode=0777 device: ${SMB_URL}
file_mode=0777和dir_mode=0777确保所有用户对挂载卷内的文件和目录拥有读写执行权限,适配公开数据场景。
3. 确认Almond运行用户
尽管你设置了user: root,Almond镜像可能默认以非root用户启动Jupyter服务。进入Almond容器执行whoami确认当前运行代码的用户:
docker exec -it <almond-container-id> whoami
如果不是root,需确保该用户的UID/GID与挂载卷的权限匹配,或在Almond服务的环境变量中强制指定运行用户为root。
4. 重启服务生效
修改配置后,彻底清理旧卷并重启服务,避免权限缓存影响:
docker-compose down -v docker-compose up -d
内容的提问来源于stack exchange,提问作者Ícaro Lorran
相关产品推荐
相关产品推荐

