如何解决docker-compose 等待启动,直到挂载主机文件系统
这个问题的重点是强制 docker-compose 等待启动 mysql 容器,直到安装主机文件系统。就我而言,主机文件系统包含 mysql 数据库文件。
对于依赖于 mysql 容器的服务,有一些脚本,例如 wait-for-it,它们作为容器入口点的一部分运行。这些脚本检查网络端口上服务的可用性。但我不知道如何让容器启动等待文件系统挂载到主机上。
当主机启动时,NFS 和 RAID 文件系统可能不会像容器启动一样快。如果文件系统在容器启动后挂载到主机上,则容器中的绑定卷不会更新。然后容器最终无法访问已安装/绑定的文件系统。
解决方法
假设您的系统使用 systemd(这很常见),解决方案是使 docker 服务依赖于文件系统的相应 .mount 单元。这将阻止 docker 在安装文件系统之前启动。描述了添加对挂载点的依赖,例如in this answer 在 https://unix.stackexchange.com 结束。
对于 /etc/fstab
中列出的每个文件系统,systemd 都会生成一个名为 <filesystem>.mount
的单元。例如,在我的系统上,/etc/fstab
包含以下内容:
/dev/tank/scratch /scratch xfs defaults 1 2
我看到以下 systemd 单元:
# systemctl list-units -t mount |grep scratch
scratch.mount loaded active mounted /scratch
我们可以通过在单元的 [Unit]
部分添加类似以下内容,使诸如 Docker 之类的服务依赖于该挂载点:
[Unit]
Requires=scratch.mount
After=scratch.mount
Requires
指令的意思是“当你启动这个服务(例如 docker
)时,也启动这里列出的单元”,而 After
指令的意思是“在此之前启动指定的单元一个”。
最低级别的服务是mysql。如果挂载的文件系统上的已知目录丢失,请修改其入口点以退出。
所有依赖服务都可以使用 dockerize 或 wait-for-it 脚本来等待 mysql 网络端口打开。
mysql:
image: mysql:5.7.30
restart: always
entrypoint: ["bash","-c","touch /testdir/dir_on_filesystem/write-test && rm /testdir/dir_on_filesystem/write-test && echo 'Test for mounted filesystem passed' && mysqld --user=root"]
volumes:
- /mnt/mountpoint/mysql:/var/lib/mysql
- /mnt/mountpoint:/testdir
如果您可以保证在第一次启动 mysql 容器之前文件系统上存在 /mnt/mountpoint/mysql
,那么您可以使用该目录代替 {{1 }}。
请注意,此入口点测试还确保文件系统未以只读方式挂载。当 RAID 阵列在系统启动期间重新同步时,它可以以只读状态开始,直到重新同步取得一些进展。检查可写性不是绝对必要的,因为如果 mysql 容器无法写入其数据库文件,它将退出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。