我知道这个很老了,但是在寻找类似东西的时候我发现它正在接收其他人的评论,就像我一样。
我已经弄清楚如何使其工作对于一个类似的情况,我花了一段时间才想出来。
这里的答案缺少一些关键信息,我将包括这些信息,可能是因为它们当时不可用。
- 我认为CIFS存储仅适用于连接到Windows系统时使用,除非该系统模拟Windows环境,否则Linux根本不使用它。
- NFS也可以完成同样的事情,它比较不安全,但几乎被所有设备支持。
您可以以类似于CIFS的方式创建NFS卷,只需进行一些更改即可。 我将列出两者,以便可以并排查看。
在使用 WSL2 上的 NFS 时,您首先需要将 NFS 服务安装到 Linux 主机操作系统中。我相信 CIFS 需要类似的服务,很可能是由 @LevHaikin 提到的 cifs-utils
,但我没有使用过,所以不确定。在我的情况下,主机操作系统是 Ubuntu,但您应该能够通过找到您系统的等效项来找到适当的安装程序 nfs-common
(或者如果正确的话是 cifs-utils
)。
sudo apt update
sudo apt install nfs-common
就这样。这将安装服务,使得NFS在Docker上能够工作(我花了很长时间才意识到这是问题所在,因为似乎没有任何地方提到需要这样做)
如果使用NFS,在网络设备上,您需要为NFS文件夹设置NFS权限,在我的情况下,这将在
folder
文件夹上完成,然后将其挂载到其中一个文件夹。没问题。(在我的情况下,作为服务器的NAS挂载到
#IP#/volume1/folder
,在NAS中,我从未在目录结构中看到
volume1
,但是当我设置NFS权限时,共享文件夹的完整路径显示在设置页面中。我不包括
volume1
部分,因为您的系统可能会有所不同),并且您想要IP之后的完整路径(使用IP作为数字,而不是HostName),根据您的NFS共享,无论它是什么。
如果使用CIFS设备,则对于CIFS权限也是如此。
nolock
选项经常被需要,但可能没有在您的系统上。它只是禁用了“锁定”文件的能力。
soft
选项意味着如果系统无法连接到挂载目录,它将不会挂起。如果您需要它仅在挂载存在时才工作,可以改为使用 hard
。
rw
(读/写)选项用于读/写,ro
(只读)选项用于只读。
由于我个人不使用 CIFS 卷,所以设置的选项仅为我找到的示例中的选项,你需要进一步研究是否对你有必要。
username
和password
是必需的,且必须包含在CIFS中。
uid
和gid
是Linux用户和组设置,应该根据容器需要设置,因为Windows不使用它们(据我所知)。
file_mode=0777
和dir_mode=0777
是Linux读/写权限,类似于chmod 0777
,给予任何可以访问文件的人读/写/执行权限(更多信息请参见链接#4),这也应该是针对Docker容器而不是CIFS主机的。
noexec
与执行权限有关,但我认为它在这里实际上没有作用,但大多数我找到的示例都包括它,nosuid
限制了它访问特定用户ID的文件的能力,除非您知道需要将其删除,否则不应该删除,因为它是一种保护措施,如果可能的话,我建议留下它,nosetuids
表示它不会为新创建的文件设置UID和GUID,nodev
表示无法访问/创建挂载点上的设备,vers=1.0
我认为是兼容性的后备方案,个人认为除非存在问题或没有它无法正常工作,否则不应包含它。
在这些示例中,我将
//NET.WORK.DRIVE.IP/folder/on/addr/device
挂载到名为"
my-docker-volume
"的卷中,并以读/写模式运行。CIFS卷使用用户
supercool
和密码
noboDyCanGue55
。
CLI中的NFS
docker volume create --driver local --opt type=nfs --opt o=addr=NET.WORK.DRIVE.IP,nolock,rw,soft --opt device=:/folder/on/addr/device my-docker-volume
CIFS从CLI连接(如果Docker安装在Windows以外的系统上,则可能无法工作,仅能连接到Windows系统上的IP)
docker volume create --driver local --opt type=cifs --opt o=user=supercool,password=noboDyCanGue55,rw --opt device=//NET.WORK.DRIVE.IP/folder/on/addr/device my-docker-volume
这也可以在Docker Compose或Portainer中完成。
当您在那里执行时,您需要在compose文件底部添加一个Volumes:
,没有缩进,在与services:
相同的级别上。
在此示例中,我正在挂载卷
my-nfs-volume
从//10.11.12.13/folder/on/NFS/device
挂载到“my-nfs-volume
”,以读/写模式挂载到容器中的/nfs
my-cifs-volume
从//10.11.12.14/folder/on/CIFS/device
挂载到“my-cifs-volume
”,使用用户supercool
和密码noboDyCanGue55
的权限以读/写模式挂载到容器中的/cifs
version: '3'
services:
great-container:
image: imso/awesome/youknow:latest
container_name: totally_awesome
environment:
- PUID=1000
- PGID=1000
ports:
- 1234:5432
volumes:
- my-nfs-volume:/nfs
- my-cifs-volume:/cifs
volumes:
my-nfs-volume:
name: my-nfs-volume
driver_opts:
type: "nfs"
o: "addr=10.11.12.13,nolock,rw,soft"
device: ":/folder/on/NFS/device"
my-cifs-volume:
driver_opts:
type: "cifs"
o: "username=supercool,password=noboDyCanGue55,uid=1000,gid=1000,file_mode=0777,dir_mode=0777,noexec,nosuid,nosetuids,nodev,vers=1.0"
device: "//10.11.12.14/folder/on/CIFS/device/"
更多细节可以在这里找到:
- https://docs.docker.com/engine/reference/commandline/volume_create/
- https://www.thegeekdiary.com/common-nfs-mount-options-in-linux/
- https://web.mit.edu/rhel-doc/5/RHEL-5-manual/Deployment_Guide-en-US/s1-nfs-client-config-options.html
- https://www.maketecheasier.com/file-permissions-what-does-chmod-777-means/