在 Docker 中安装的卷中写入文件时权限被拒绝

问题描述 投票:0回答:1

我想要完成一个相对简单的任务,即能够从附加到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 docker-compose samba selinux
1个回答
0
投票

首先,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()
命令期间正在执行的用户操作。

© www.soinside.com 2019 - 2024. All rights reserved.