使用SMB共享作为docker卷

时间:2017-03-22 20:35:56

标签: docker raspberry-pi docker-compose

我是docker和docker-compose的新手 我正在尝试使用我的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文件只是从图像创建一个容器,并将其自己的本地/home/test文件夹绑定到主机上的/mnt/test文件夹。

从脚本启动时,这非常好用。但是,我希望容器在主机重新启动时自动重启,因此我将“always”指定为重启策略。在重新启动的情况下,容器会在没有任何人安装远程文件夹的情况下自动启动,因此服务将无法正常运行。

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

由于

2 个答案:

答案 0 :(得分:1)

  

解决此问题的最佳方法是什么?

正如@Frap建议的那样,使用systemd个单元来管理挂载和服务以及它们之间的依赖关系。

This document讨论了如何将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在尝试访问此共享之前等待网络可用。 Before=docker.service行将导致systemd仅在挂载此共享后才启动docker。 RequiredBy=docker.service表示如果您启动docker.service,将首先挂载此共享(如果尚未挂载),并且如果挂载失败,则docker将无法启动。

这是使用凭证文件而不是在单位本身中指定用户名/密码;凭证文件如下所示:

username=test
password=test

您只需将credentials选项替换为username=password=

  

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

标准Docker容器无法挂载文件系统。您可以创建一个特权容器(通过向--privileged命令行添加docker run),但这通常是一个坏主意(因为该容器现在对您的主机具有不受限制的root访问权限。)

答案 1 :(得分:0)

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

只有2行代码并且不依赖于任何特定的Unix风格,它对我来说就像是最便携的解决方案,除了我无法找到的仅限docker的解决方案。

感谢大家的答案