当运行一个使用远程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挂载工作正常。
1条答案
按热度按时间b4lqfgs41#
尝试在mount选项中添加
nobrl
。下面是一个related discussion on Docker forum。来自the manpage:nobrl -不向服务器发送字节范围锁请求。这对于某些打破cifs样式强制字节范围锁的应用程序是必要的(大多数cifs服务器还不支持请求咨询字节范围锁)。