使用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.service
。 RequiredBy=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之外。
感谢所有的答案