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

docker 部署 mysql 和 spring boot 的集群,容器启动顺序问题

  •  1
     
  •   tionsin · 2019-02-26 23:09:00 +08:00 · 3900 次点击
    这是一个创建于 2086 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 docker-compose 编排以后就会出现 mysql 启动慢,导致 spring boot 没有连接数数据源无法启动..看了很多关于容器启动顺序的文章..还是没有解决..看看 v2 有没有大佬可以解决!


    这是 docker-compose.yml

    version : '2'
    services:
      mysql:
        image: jo/mysql
        volumes:
               - ./src/main/docker/mysql/my.cnf:/root/mysql/my.cnf mysql
        environment:
           - MYSQL_ROOT_PASSWORD=123456
        ports:
           - "3306:3306"
        expose:
           - "3306"
    
      frp:
        build: frp
        volumes:
          - ./wait-for-it.sh:/wait-for.sh
        ports:
          - "8999:8999"
        restart: always
        depends_on:
          - mysql
        links:
          - mysql
        entrypoint: "sh /wait-for.sh mysql:3306 -- java -Djava.security.egd=file:/dev/./urandom jar app.jar"
    
    

    运行之后没有报错,只是运行不起来..

    17 条回复    2019-02-27 09:32:13 +08:00
    blackeeper
        1
    blackeeper  
       2019-02-26 23:24:11 +08:00   ❤️ 2
    最好的办法就是利用 docker 的健康检查功能来自动重启应用,或者程序做好数据库重连
    其实官方是有指导文档,看这个链接: https://docs.docker.com/compose/startup-order/
    tionsin
        2
    tionsin  
    OP
       2019-02-26 23:29:15 +08:00
    @blackeeper 大佬我就是用的这个....但是不知道哪里有问题..
    blackeeper
        3
    blackeeper  
       2019-02-26 23:32:45 +08:00
    额,看了你的日志,frp 是正常退出的,返回 0 值,再看你的 compose file,我猜你的 entrypoint 有问题
    hilbertz
        4
    hilbertz  
       2019-02-26 23:41:32 +08:00
    Beebird
        5
    Beebird  
       2019-02-27 00:12:47 +08:00 via Android   ❤️ 1
    信息似乎不够多。可以分别检查 mysql 和 frp 有没有正常启动。docker exec 进入 frp 手动连接 mysql 看是否连上。如果都正常的话,单独停止并删除 frp 再 docker-compose up -d 试试。
    tionsin
        6
    tionsin  
    OP
       2019-02-27 00:20:09 +08:00
    @Beebird 都试过了,现在所有脚本,启动顺序都解决了..剩下一个 spring boot 的 appcation.yml 配置错了,连不上.我还在找 bug....orz
    Junn
        7
    Junn  
       2019-02-27 00:45:25 +08:00 via iPhone
    手动起,确定不是连接问题?
    tionsin
        8
    tionsin  
    OP
       2019-02-27 00:52:37 +08:00
    @Junn 是本地打包到 linux
    tionsin
        9
    tionsin  
    OP
       2019-02-27 01:02:14 +08:00
    @Beebird @Junn @blackeeper @hilbertz 已经可以了,感谢.
    precisi0nux
        10
    precisi0nux  
       2019-02-27 04:03:35 +08:00 via iPhone
    @tionsin 可以分享一下最后的解决办法吗?
    tionsin
        11
    tionsin  
    OP
       2019-02-27 07:19:15 +08:00 via Android
    @precisi0nux 就是拥抱官方文档啊
    hzwjz
        12
    hzwjz  
       2019-02-27 08:59:36 +08:00 via Android
    连接 MySQL 之前,写个检测 MySQL 的 entrypoint 脚本,
    freakxx
        13
    freakxx  
       2019-02-27 09:15:35 +08:00
    @tionsin
    脚本挂在前台运行
    indiemaple
        14
    indiemaple  
       2019-02-27 09:23:55 +08:00
    @tionsin 说一下具体方法嘛
    thisisgpy
        15
    thisisgpy  
       2019-02-27 09:28:41 +08:00
    depends_on 只是确保 frp 容器在 mysql 容器 run 起来之后启动,并不会保证 mysql 容器里面的服务启动完成。
    tionsin
        16
    tionsin  
    OP
       2019-02-27 09:31:50 +08:00
    @indiemaple 就是在 mysql 完全运行之前,阻塞 spring boot;然后在 mysql 启动以后再启动 springboot;
    docker-compose 中的 spring 服务加上一个 enterpoint: entrypoint: "./w.sh mysql:3306 -- java -jar /app.jar" 这是我的程序进入点..你自己改改就行..w.sh 就是 wait-for-it.sh
    tionsin
        17
    tionsin  
    OP
       2019-02-27 09:32:13 +08:00
    @thisisgpy 我知道..
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1038 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:26 · PVG 04:26 · LAX 12:26 · JFK 15:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.