V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dangyuluo
V2EX  ›  Docker

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

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

    机器上跑着有 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  
       335 天前
    容器启动时候使用这个脚本: https://github.com/vishnubob/wait-for-it
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1182 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:54 · PVG 07:54 · LAX 15:54 · JFK 18:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.