使用wait监听tomcat服务启动

news/2024/10/17 16:23:26/

文章的wait脚本素材会放在末尾

执行docker-compose.yml文件之后就有mysql的主服务器,还有从服务器,还有tomcat服务,在tomcat中部署一个crm项目,tomcat服务中我们添加了启动顺序,

# 启动顺序

 depends_on:
      - mysql-master
    # 执行命令
    command: "./wait-for-it.sh -t 0 mysql-master:3306 -- catalina.sh run"

./ :表示执行某个命令

-t : 表示等待时间, 0 无限等待, 意思是我等待的服务没启动,就会等到台启动为止,如果不写-t的话默认是15秒,15秒我就收不到响应,文件继续执行后面的服务

mysql-master:3306:要等待的服务

--catalina.sh run :等待的服务给了响应之后就会执行这个文件

在tomcat服务器启动之后就会等待mysql服务器里面的3306给响应为止,只要给了响应就会执行catalina.sh让整个服务运行起来

为什么要设置启动顺序?

因为mysql的主从启动之后,我们的tomcat才能去执行,如果tomcat服务器先启动了,mysql还没有连接上数据库,那么tomcat就会报错的,tomcat服务里面的crm项目需要mysql服务连接数据库获取数据,
但是这样设置也会有问题,  如果mysql容器一秒启动,但是mysql容器里面的服务要十秒启动,那么tomcat第二秒就去访问mysql的时候就会报错,

容器启动了,不代表里面的访问也启动了!

我们还需要通过脚本让tomcat去监听mysql的服务,tomcat监听到mysql的服务已经完全启动之后在去访问,就不会报错了

解决方案:docker官方推荐使用wait-for-it.sh脚本来解决问题
什么是wait-for-it.sh?
wait-for-it.sh脚本用来访问指定的地址和端口,如果收不到响应就等待一段时间再去重试,直到收到响应后,再去做前面指定好的命令
 command: "./wait-for-it.sh -t 0 mysql-master:3306 -- catalina.sh run"

  注意事项:注意如果你使用wait-for-it.sh脚本,如果你的基础镜像不包含bash命令(比如alpine镜像)需要安装bash,

我们就需要使用到wait

# 版本号
version: '3'
# 定义服务
services:# 服务名mysql-master:# 容器名称container_name: mysql-master# 镜像image: mysql/mysql-server:5.7# 重启restart: always# 提供伪终端tty: true# root具备管理员权限privileged: true# 环境变量environment:MYSQL_ROOT_PASSWORD: 123456# 数据卷(目录映射)volumes:- /data/mysql-master/conf/my.cnf:/etc/my.cnf- /data/mysql-master/data:/var/lib/mysql# 网络networks:mynetwork:ipv4_address: 172.19.0.3# 服务名mysql-slave:# 容器名称container_name: mysql-slave# 镜像image: mysql/mysql-server:5.7# 重启restart: always# 提供伪终端tty: true# root具备管理员权限privileged: true# 环境变量environment:MYSQL_ROOT_PASSWORD: 123456# 数据卷(目录映射)volumes:- /data/mysql-slave/conf/my.cnf:/etc/my.cnf- /data/mysql-slave/data:/var/lib/mysql# 网络networks:mynetwork:ipv4_address: 172.19.0.4# 服务名tomcat-0:# 容器名称container_name: tomcat-0# 镜像image: tomcat:8.5.40# 重启restart: always# 端口映射ports:- 8080:8080# 启动顺序depends_on:- mysql-master# 执行命令command: "./wait-for-it.sh -t 0 mysql-master:3306 -- catalina.sh run"# 提供伪终端tty: true# root具备管理员权限privileged: true# 环境变量environment:TZ: Asia/Shanghai# 数据卷(目录映射)volumes:- /data/tomcat/webapps:/usr/local/tomcat/webapps# 网络networks:mynetwork:ipv4_address: 172.19.0.5
# 定义所需要的网络
networks:mynetwork:driver: bridgeipam:config:- subnet: 172.19.0.0/16

这是别人写的开源脚本

解压之后的结构目录

 

 我们需要用到画红线的文件,我们使用rz上传wait-for-it.sh

上传之后我们还需要给它添加可执行权限

chmod 777 wait-for-it.s

给了它权限之后就变了颜色,就代表是可执行文件了 

 tomcat要用到wait脚本,我们还要创建一个自定义镜像,把wait脚本放到镜像里面去,每次创建的时候就会自带wait脚本

创建一个Dockerfile,

touch Dockerfile-mytomcat8.5.40

vi 把以下内容放在进去

#1.指定基础镜像,并且必须是第一条指令
FROM tomcat:8.5.40#2.指明该镜像的作者和其电子邮件
MAINTAINER xyz "xyz@qq.com"#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR /usr/local/tomcat/bin#4.将wait-for-it.sh复制到镜像中
COPY ./wait-for-it.sh /usr/local/tomcat/bin/#5.容器启动后无法访问wait-for-it.sh,授权777即可
RUN chmod 777 ./wait-for-it.sh

 使用以下命令开始构建

 docker build -f Dockerfile-mytomcat8.5.40 -t mytomcat:8.5.40 .

docker images 查看镜像

 


启动docker-compose.yml

docker-compose up -d

 ​​​​​​​​​​​​​​​​​​​​​

 使用docker  logs -f tomcat-0 监听一下服务日志

tomcat 没有报错的

我们测试一下wait的作用

停止mysql的主服务器

然后我们去服务crm项目,报错了500,原因是连接不上数据库

 

 在去看一下监听的tomcat服务的日志,也在报错

 

 我们刚刚把mysql主服务器关闭了,我们现在重启一下tomcat服务看能不能正常启动

docker-compose restart tomcat-0 //重启

重启之后我们重新去监听一下日志,发现卡住了,意思是wait这个脚本在等待mysql主服务器的3306端口发来响应,然后运行。

 现在我们启动mysql主服务器

docker-compose start mysql-master

 回到日志一看,tomcat服务已经继续运行了 


 好啦 文章内容到这里就结束了  你学到了吗  

觉得有用的记得关注点赞加收藏哦  我的Docker专栏还有其他关于Dokcer的技术点哦~

我敲BUG的Docker专栏:http://t.csdn.cn/ypXDz

  


http://www.ppmy.cn/news/47264.html

相关文章

XO08R2 1SBP260109R1001接地系统能够为dcs提供屏蔽层,消除电子噪声干扰

​ XO08R2 1SBP260109R1001接地系统能够为dcs提供屏蔽层,消除电子噪声干扰 dcs合理、可靠的系统接地,是dcs系统非常重要的内容。为了保证dcs系统的监测控制精度和安全、可靠运行,必须对系统接地方式、接地要求、信号屏蔽、接地线截面选择、接…

【C++】STL——vector 深度剖析 及 模拟实现

文章目录 前言1. vector的介绍及使用1.1 vector的介绍1.2 vector的使用1.2.1 构造函数1.2.2 vector对象的遍历1.2.3 vector的迭代器1.2.4 reserve和resize1.2.5 insert和erase1.2.6 vector< char > 能否替代string 2. vector的模拟实现2.1 STL_vector源码浏览2.2 vector的…

从EXCEL BOM 描述中提取部分信息---正则表达式使用

从EXCEL BOM描述中提取关键的信息&#xff0c;用于建库填写内容&#xff0c;或者检查BOM等都会用到&#xff0c;如下大概通过两种方式实现信息的提取 1.手动Excel中提取 2.将如上1的方式用python实现&#xff0c;可以实现批量操作&#xff0c;减少操作带来的错误&#xff0c;…

WPS表格查找替换技巧:让你的工作效率翻倍

WPS表格中查找和替换是最基础的操作&#xff0c;看似简单&#xff0c;但是还有很多人在工作中不会熟练使用&#xff0c;其实掌握一些小技巧可以快速提高工作效率&#xff0c;本节课就来介绍几种比较有效的“查找和替换技巧”。 本节课目录&#xff1a; 1、常规的查找和替换 2…

PHP - 什么是 PHP? 为什么用 PHP? 有谁在用 PHP?

什么是 PHP&#xff1f; PHP 是一种脚本语言&#xff0c; "PHP Hypertext Preprocessor" 的首字母缩略词 PHP 语法吸收了 C 语言、Java 和 Perl 的特点&#xff0c;利于学习&#xff0c;使用广泛&#xff0c;主要适用于 Web 开发领域. PHP 是由 Rasmus Lerdorf 于 1…

App Inventor 2 开发问答App

应用介绍 一个最基本的问答App开发&#xff0c;问答数据源来自csv文件格式&#xff0c;方便后续拓展成网络版的问答App。 事先出好题目、ABCD选择项及正确答案&#xff0c;先存在列表中&#xff0c;然后按顺序出题&#xff0c;答对则继续下一题&#xff0c;答错则Game over。 …

C# 中的异步编程模型(Async/Await)和并行编程模型(Parallel)。

C# 中的异步编程模型&#xff08;Async/Await&#xff09;和并行编程模型&#xff08;Parallel&#xff09;是在处理异步操作和并行处理任务方面非常重要的概念。 异步编程模型&#xff08;Async/Await&#xff09;&#xff1a; 异步编程模型&#xff08;Async/Await&#xf…

React 条件渲染组件

组件通常需要根据不同的条件显示不同的内容&#xff0c;以及根据应用的状态变化只渲染其中的一部分。 在 React 中&#xff0c;可以使用 JavaScript 语法有条件地呈现 JSX&#xff0c;比如 if 语句、&&和 ?: 操作符。 根据条件返回 JSX Demo.js 文件&#xff1a; …