我想要完成一个相对简单的任务,即能够从附加到docker的samba共享中读取和写入。我有几个共享相同卷的服务,它们大多是 Spark Workers 和 Master。我还有一个杏仁 jupyter 服务器可以访问此卷。一切都部署为 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}
如您所见,我尝试了多种方法来提升权限或完全否定安全功能,这对于这些容器来说很好,因为我正在处理公共数据。
如果我尝试从杏仁笔记本写入卷,则会收到错误:
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
首先,docker 文件中的以下行在
gid
和 1000
之间有一个破折号,它应该是 =
。 o: username=${SMB_USER},password=${SMB_PASSWORD},uid=1000,gid-1000,vers=3.0,rw
但也许这只是将代码放在此处时的一个错误。
无论如何,我认为这条线可能是可能解决方案的关键。当您装载卷时,您应该提供稍后将使用装载的用户的用户 ID 和组 ID。默认值通常是 root 用户,或者该用户有权自行进行挂载的任何用户。
在您的情况下,只有 owner (
drwxr-xr-x
) 具有对该文件夹的写入权限,并且所有者是 1021
。所以我认为你应该尝试使用o: username=${SMB_USER},password=${SMB_PASSWORD},uid=1021,gid=1000,vers=3.0,rw
来安装。
如果这不起作用,请在尝试写入文件夹之前运行命令
id
,并仔细检查在 file.createNewFile()
命令期间正在执行的用户操作。