我是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脚本?我应该从容器内安装远程文件夹吗?
由于
答案 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的解决方案。
感谢大家的答案