访问远程TrueNAS SMB共享的Docker容器R/W权限

hpxqektj  于 2023-03-29  发布在  Docker
关注(0)|答案(1)|浏览(564)

当运行一个使用远程SMB共享来存储配置文件的容器时,我一直在努力解决权限问题。
我找到了这篇文章和答案,但似乎仍然无法让事情运转起来:
docker-add-network-drive-as-volume-on-windows
对于下面的YAML代码,是的,所有内容的格式都是正确的。我只是从我的reddit帖子中复制了这个,现在缩进没有正确显示。
我的设置如下:
运行Proxmox作为我的虚拟机管理程序:
TrueNAS可作为NAS进行扩展
用于托管Docker的Debian VM
TrueNAS虚拟机有一个池,其中1个数据集用于SMB共享,1个数据集用于NFS共享(为排除故障而实施)
我有凭据steve:steve(1000:1000)supersecurepassword,对SMB共享具有完全控制ACL权限。我可以通过Windows和CLI访问此共享,并使所有预期操作按预期运行。
在Debian主机上,我创建了用户steve:steve(1000:1000)和supersecurepassword。
我已经能够使用cifs在debian主机中成功地挂载和Map共享:
//192.168.10.206/dockerdata /mnt/dockershare cifsuid=1000,gid=1000,vers=3.0,credentials=/root/.truenascreds 0 0
这些证书包括:

username=steve
password=supersecurepassword

我可以通过挂载点从CLI读/写,查看文件,修改文件等。
我还使用以下附加选项成功挂载和读/写共享:
file_mode=0777,dir_mode=0777,noexec,nosuid,nosetuids,nodev
现在我开始遇到问题了。我可以创建一个容器用户docker compose,portainer(手动创建和堆栈compose),但在容器尝试启动时遇到数据库错误。

version: "2.1"

services:

babybuddytestsmbmount:

image: lscr.io/linuxserver/babybuddy:latest

container_name: babybuddytestsmbmount

environment:

- PUID=1000

- PGID=1000

- TZ=America/New_York

- CSRF_TRUSTED_ORIGINS=http://127.0.0.1:8000,https://babybuddy.domain.com

ports:

- 1801:8000

restart: unless-stopped

volumes:

- /mnt/dockershare/babybuddy2:/config

Docker将创建所有文件夹和文件,启动容器,但webui将返回服务器500错误。日志显示这些数据库错误,导致大量异常:

sqlite3.OperationalError: database is locked

django.db.utils.OperationalError: database is locked

django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table (database is locked)

我还尝试使用以下方法在docker卷中挂载SMB共享:

version: "2.1"

services:

babybuddy:

image: lscr.io/linuxserver/babybuddy:latest

container_name: babybuddy

environment:

- PUID=1000

- PGID=1000

- TZ=America/New_York

- CSRF_TRUSTED_ORIGINS=http://127.0.0.1:8000,https://babybuddy.domain.com

ports:

- 1800:8000

restart: unless-stopped

volumes:

- dockerdata:/config

volumes:

dockerdata:

driver_opts:

type: "cifs"

o: "username=steve,password=supersecurepassword,uid=1000,gid=1000,file_mode=0777,dir_mode=0777,noexec,nosuid,nosetuids,nodev,vers=3.0"

device: "//192.168.10.206/dockerdata"

我也在选项中尝试了这个:
o: "username=steve,password=supersecurepassword,uid=1000,gid=1000,rw,vers=3.0"
Docker再次能够创建容器,创建和挂载卷,创建所有文件夹和文件,但遇到上面指出的相同的DB错误。
我相信这是因为容器试图以root身份访问SMB共享,而TrueNAS不允许。我已经验证了所有文件和文件夹的所有权都是正确的,并且在故障排除过程中也停止了容器,递归地将数据集chown和chgrp到root:root,重新启动容器,没有骰子。将debian主机上的SMB credntials更改为root导致连接失败。
测试以确保我没有其他问题导致问题,我能够成功地在主机上本地启动容器,并使用来自同一TrueNAS VM的远程NFS共享。
我还尝试了数据集权限,在TrueNAS中更改所有者,尝试不使用ACL的权限等。
这些变化中的每一个都是用SMB的新数据集和Docker的清除和重新创建以及debian的重新安装完成的。
任何帮助或建议将不胜感激。
编辑:我也尝试过用Ubuntu作为docker主机,并试图让docker在steve用户下运行,结果是灾难性的。
我希望能够在我的Debian docker主机上的TrueNAS系统上挂载SMB共享,并在容器的数据库文件中遇到写入错误。本地docker示例和NFS挂载工作正常。

b4lqfgs4

b4lqfgs41#

尝试在mount选项中添加nobrl。下面是一个related discussion on Docker forum。来自the manpage
nobrl -不向服务器发送字节范围锁请求。这对于某些打破cifs样式强制字节范围锁的应用程序是必要的(大多数cifs服务器还不支持请求咨询字节范围锁)。

相关问题