使用SMB共享作为docker卷

我是新来的docker和docker撰写。
我正在尝试在我的Raspberry PI上使用docker-compose来运行服务。 此服务使用的数据存储在我的NAS上,可通过samba访问。
我目前正在使用这个bash脚本启动容器:

sudo mount -t cifs -o user=test,password=test //192.168.0.60/test /mnt/test docker-compose up --force-recreate -d 

docker-compose.yml文件只需从映像创build一个容器,并将其自己的本地/home/test文件夹绑定到主机上的/mnt/test文件夹。

从脚本启动时,这个工作非常好。 但是,我希望容器在主机重新启动时自动重启,所以我指定了“always”作为重启策略。 在重启的情况下,容器自动启动,没有任何人挂载远程文件夹,因此服务将无法正常工作。

解决这个问题最好的办法是什么? 我应该使用卷驱动来安装远程共享(我在ARM架构上,所以我的select是有限的)? 有没有办法在启动docker-compose过程时在主机上运行shell脚本? 我应该从容器内安装远程文件夹吗?

谢谢

解决这个问题最好的办法是什么?

正如@Frap所build议的那样,使用systemd单位来pipe理装载和服务以及它们之间的依赖关系。

本文讨论如何将Samba安装设置为systemd单元。 在Raspbian下,它应该是这样的:

 [Unit] Description=Mount Share at boot After=network-online.target Before=docker.service RequiredBy=docker.service [Mount] What=//192.168.0.60/test Where=/mnt/test Options=credentials=/etc/samba/creds/myshare,rw Type=cifs TimeoutSec=30 [Install] WantedBy=multi-user.target 

把它放在/etc/systemd/system/mnt-test.mount ,然后:

 systemctl enable mnt-test.mount systemctl start mnt-test.mount 

After=network-online.target行应该会导致systemd在尝试访问该共享之前等待networking可用。 Before=docker.service行将导致systemd仅在此共享被挂载后启动Before=docker.serviceRequiredBy=docker.service意味着如果你启动docker.service ,这个共享将首先挂载(如果还没有的话),如果挂载失败,docker将不会启动。

这是使用凭证文件,而不是在单元中指定用户名/密码; 一个凭证文件看起来像这样:

 username=test password=test 

你可以用username=password=replacecredentials选项。

我应该从容器内安装远程文件夹吗?

标准的Docker容器不能挂载文件系统。 您可以创build一个特权容器(通过在--privileged docker run命令行中添加--privileged ),但这通常是一个糟糕的主意(因为该容器现在拥有对主机的无限制的根访问权限)。

我终于通过定义在/etc/rc.local文件中运行的脚本来“解决”自己的问题。 它将在每次重启时启动mount和docker-up命令。

由于只有两行代码,并不依赖于任何特定的Unix风格,所以对我来说就像是最便携的解决scheme一样,除了我无法find的仅有docker的解决scheme之外。

感谢所有的答案