如何让一个 Docker 容器在系统启动时延迟启动 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dangyuluo
V2EX    Docker

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

  •  
  •   dangyuluo 2023-10-21 13:57:41 +08:00 3170 次点击
    这是一个创建于 799 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    16 条回复    2023-12-10 20:34:37 +08:00
    totoro625
        1
    totoro625  
       2023-10-21 13:59:39 +08:00
    通过 depends_on 告诉 docker-compose 当前服务启动之前先要把 depends_on 指定的服务启动起来才行。
    例如:kafka 依赖 zookeeper ,nginx 依赖 php-fpm 等等。
    GeruzoniAnsasu
        2
    GeruzoniAnsasu  
       2023-10-21 14:03:07 +08:00
    补充,被依赖的服务可能需要恰当的 heath check 方法
    dangyuluo
        3
    dangyuluo  
    OP
       2023-10-21 14:07:26 +08:00
    @totoro625 `depends_on`只能保证 ABCD 同一时间启动,没有办法做到延迟。


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

    然后 D depends_on ABC 的 healthcheck

    https://docs.docker.com/engine/reference/builder/#healthcheck
    wcyl
        12
    wcyl  
       2023-10-21 16:08:34 +08:00
    a282810
        13
    a282810  
       2023-10-21 17:02:04 +08:00
    crontab @reboot sleep 重启容器
    julyclyde
        14
    julyclyde  
       2023-10-21 22:40:54 +08:00
    如果你这么问,那一定是你的需求有问题
    看完之后发现是 AB 问题:你认为启动慢应该用延迟来解决,于是问怎么延迟
    但其实应该用依赖来解决,因为依赖才是其本质
    julyclyde
        15
    julyclyde  
       2023-10-21 22:42:15 +08:00
    既然 D 对 ABC 有依赖
    那你就按照它依赖的方式去写一个 healthcheck 即可
    hdfg159
        16
    hdfg159  
       2023-12-10 20:34:37 +08:00
    容器启动时候使用这个脚本: https://github.com/vishnubob/wait-for-it
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3340 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 04:43 PVG 12:43 LAX 20:43 JFK 23:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86