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

2019-02-26 23:09:00 +08:00
 tionsin

使用 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"

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

3744 次点击
所在节点    程序员
17 条回复
blackeeper
2019-02-26 23:24:11 +08:00
最好的办法就是利用 docker 的健康检查功能来自动重启应用,或者程序做好数据库重连
其实官方是有指导文档,看这个链接: https://docs.docker.com/compose/startup-order/
tionsin
2019-02-26 23:29:15 +08:00
@blackeeper 大佬我就是用的这个....但是不知道哪里有问题..
blackeeper
2019-02-26 23:32:45 +08:00
额,看了你的日志,frp 是正常退出的,返回 0 值,再看你的 compose file,我猜你的 entrypoint 有问题
hilbertz
2019-02-26 23:41:32 +08:00
Beebird
2019-02-27 00:12:47 +08:00
信息似乎不够多。可以分别检查 mysql 和 frp 有没有正常启动。docker exec 进入 frp 手动连接 mysql 看是否连上。如果都正常的话,单独停止并删除 frp 再 docker-compose up -d 试试。
tionsin
2019-02-27 00:20:09 +08:00
@Beebird 都试过了,现在所有脚本,启动顺序都解决了..剩下一个 spring boot 的 appcation.yml 配置错了,连不上.我还在找 bug....orz
Junn
2019-02-27 00:45:25 +08:00
手动起,确定不是连接问题?
tionsin
2019-02-27 00:52:37 +08:00
@Junn 是本地打包到 linux
tionsin
2019-02-27 01:02:14 +08:00
@Beebird @Junn @blackeeper @hilbertz 已经可以了,感谢.
precisi0nux
2019-02-27 04:03:35 +08:00
@tionsin 可以分享一下最后的解决办法吗?
tionsin
2019-02-27 07:19:15 +08:00
@precisi0nux 就是拥抱官方文档啊
hzwjz
2019-02-27 08:59:36 +08:00
连接 MySQL 之前,写个检测 MySQL 的 entrypoint 脚本,
freakxx
2019-02-27 09:15:35 +08:00
@tionsin
脚本挂在前台运行
indiemaple
2019-02-27 09:23:55 +08:00
@tionsin 说一下具体方法嘛
thisisgpy
2019-02-27 09:28:41 +08:00
depends_on 只是确保 frp 容器在 mysql 容器 run 起来之后启动,并不会保证 mysql 容器里面的服务启动完成。
tionsin
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
2019-02-27 09:32:13 +08:00
@thisisgpy 我知道..

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

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

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

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

© 2021 V2EX