如何让一个 Docker 容器在系统启动时延迟启动

201 天前
 dangyuluo

机器上跑着有 5 个容器,均为各种 docker-compose 管理的服务,系统启动时自动运行,其中服务 D 依赖服务 ABC 。问题是,所有容器均在同一时间启动,ABC 启动太慢,导致 D 每次都会报错退出。

请问有没有什么方便的办法控制容器启动的相对间隔时间?

1696 次点击
所在节点    Docker
16 条回复
totoro625
201 天前
通过 depends_on 告诉 docker-compose 当前服务启动之前先要把 depends_on 指定的服务启动起来才行。
例如:kafka 依赖 zookeeper ,nginx 依赖 php-fpm 等等。
GeruzoniAnsasu
201 天前
补充,被依赖的服务可能需要恰当的 heath check 方法
dangyuluo
201 天前
@totoro625 `depends_on`只能保证 ABCD 同一时间启动,没有办法做到延迟。


@GeruzoniAnsasu 因为不是自己控制的代码,所以做不到 health check 。不过其实只要延迟 1 分钟就可以保证成功了。
GeruzoniAnsasu
201 天前
@dangyuluo 那也可以依赖一个只用来延时的空服务
wtks1
201 天前
那就不要让容器自动启动,直接整个开机启动脚本,然后把 docker 启动容器的命令按照顺序写在脚本里
mamtou
201 天前
在 d 里启动前加一个监听探测 abc 的服务,探测到 abc 之后再启动
antipro
201 天前
healthcheck 只是个返回成功失败的命令,你可以估算程序启动时间,用 sleep 作个延迟再返回成功。
ysc3839
201 天前
写个脚本启动容器吧。我自己服务器上因为把 tmp 里面的文件夹映射到了容器内,重启后会消失,需要在启动前先创建并设置文件权限。而 Docker 并没有提供容器启动前执行脚本的功能,只能自己写一个脚本做完操作后再启动容器。
mamtou
201 天前
ljsh093
201 天前
不可以设置除非手动退出一直重启吗
wcyl
201 天前
必须得给 ABC 加一个 healthcheck, 可以自己写一个 shell 计时语句

然后 D depends_on ABC 的 healthcheck

https://docs.docker.com/engine/reference/builder/#healthcheck
wcyl
201 天前
a282810
201 天前
crontab @reboot sleep 重启容器
julyclyde
201 天前
如果你这么问,那一定是你的需求有问题
看完之后发现是 AB 问题:你认为启动慢应该用延迟来解决,于是问怎么延迟
但其实应该用依赖来解决,因为依赖才是其本质
julyclyde
201 天前
既然 D 对 ABC 有依赖
那你就按照它依赖的方式去写一个 healthcheck 即可
hdfg159
151 天前
容器启动时候使用这个脚本: https://github.com/vishnubob/wait-for-it

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/984031

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX