You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:24:50