使用wait监听tomcat服务启动

news2024/9/28 23:29:39

文章的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: bridge
    ipam:
      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.coloradmin.cn/o/429724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

低压接地系统:TN-C 、TN-S、TN-C-S、TT、IT

电力系统的接地直接关系到用户的人身和财产安全,以及电气设备和电子设备的正常运行。如何针对实际情况选择合适的接地系统,确保配电系统及电气设备的安全使用,是电气设计人员面临的首要问题。 根据 国际电工委员会(IEC)规定的各种保护接地方式的术语概念,低压配电系统按…

如何利用开源思想开发一个SEO友好型网站

当你对一个网站进行 SEO 优化的时候,不要期望你的努力能立即得到回报。耐心等待并更正内容营销策略,最终会发现你的网站很受用户欢迎。下面就教你如何利用开源思维开发一个SEO友好型网站! 首先,你应该知道:93% 的网站…

修复开源VS Code 插件Trino Driver的三个小问题

前言 最近产品中使用到一款SQLTools的VS Code插件。该插件可以在VS Code中实现数据库管理,而且支持非常多的数据源类型, 官方的数据源类型有CockroachDB,MariaDB,MySQL,PostgreSQL,SQLite,Micr…

电脑录屏按哪个键?您可以这样操作!

案例:电脑按哪3个键,可以录屏? 【我平常喜欢使用快捷键在电脑上快速完成一些操作。最近接触到了电脑录屏,感觉使用它一系列的操作比较麻烦。想在这里问问小伙伴们,有没有使用快捷键成功操作过的朋友!】 电…

【Linux】页表的深入分析

上一篇文章介绍了线程的基本概念 而本篇文章我们来深入理解一下, CPU再调度我们以往理解的进程和如今的线程都会涉及到的一个内容: 页表 文章目录深入理解页表 *页表的实际组成*什么是page?深入理解页表 * 在介绍进程时, 博主没有深入介绍过页表. 只是简单说了 页…

DAY 40 firewalld 防火墙

firewalld防火墙是centos7系统默认的防火墙管理工具,取代了之前的iptables防火墙,也是工作在网络层,属于包过滤防火墙。 支持IPv4、IPv6防火墙设置以及以太网桥支持服务或应用程序直接添加防火墙规则接口拥有两种配置模式:临时模…

【快乐手撕LeetCode题解系列】—— 环形链表 II

【快乐手撕LeetCode题解系列】—— 环形链表 II😎前言🙌环形链表 II🙌画图分析:😍思路分析:😍源代码分享:😍总结撒花💞😎博客昵称:博客…

了解oauth2.0

1 什么是 OAuth2.0 开发授权(OAuth)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片、视频、联系人列表等),而无需将用户名和密码提供给第三方应用。 OAuth 允许用户…

我的软件测试故事:成长、迷茫、奋斗

前言 测试工作6年,经历过不同产品、共事过不同专业背景、能力的同事,踩过测试各种坑、遇到过各种bug。测试职场生涯积极努力上进业务和技术能力快速进步过、也有努力付出却一无所得过、有对测试生涯前景充满希望认为一片朝气蓬勃过、也有对中年危机思考不…

OpenAI Embedding:快速实现聊天机器人(二)

theme: orange 本文正在参加「金石计划」 接上文OpenAI Embedding:快速实现聊天机器人(一)有讲到聊天机器人的一些概念,这篇开始讲讲这个聊天机器人的架构和流程。 总架构图 这里我参照一个现成的架构图来讲如何实现,其是基于Azure多个相关云…

香港进出口报关指南

由于香港优越的地理位置和政策支持,大部分外贸货物通过香港出口到世界各地。与内地海关相比,香港报关更简单快捷。司机可根据内地舱单填写一份香港进/出口舱单(俗称司机纸)进出香港海关,并在货物抵港后14天内申报。 香港进出口报关需要提供哪…

单机/集群/热备/磁盘阵列(RAID)的区别详解

一、单机部署(stand-alone) 单个服务器,只有一个饮水机提供服务,服务只部署一份。 二、集群部署(cluster) 服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有…

MySQL连接空闲时间超过8小时报错原因与延伸知识

1 错误原因 1.1 两个参数 MySQL服务端两个参数控制连接超时时间: wait_timeoutinteractive_timeout1.1.1 如何查看 show global variables like interactive_timeout show global variables like wait_timeout 复制代码 1.1.2 含义与区别 wait_timeout&#xf…

JAVA System.nanoTime()与GO time.Now().UnixNano()区别

JAVA System.nanoTime() public static void main(String[] args) {long nano System.nanoTime();System.out.println(nano);} 输出:701863191254000,这个值有点奇怪,System.currentTimeMillis()不是System.nanoTime()的1000000倍。 这个值…

【springcloud开发教程】路由网关——zuul

官方资料:https://github.com/Netflix/zuul/ 什么是Zuul? Zuul包含了两个主要的功能:路由和过滤 路由功能将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预&#…

Ubuntu环境安装指定版本的docker 和一键卸载dockerdocker-compose

一、环境 我的linux系统是Ubuntu 22.04 二、开始安装 卸载旧版 由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本: $ sudo apt-get remove docker docker-engine docker-ce docker.io更新apt包索引 $ sudo apt-get update安装以下…

基础工业工程(易树平、郭伏)——第四章 程序分析

第四章 程序分析 第一节 程序分析概述 一、程序分析的概念、特点及目的 1.程序分析的概念 程序分析是一种重要的生产管理工具,它是依照工作流程,从第一个工作地到最后一个工作地,全面地分析有无多余、重复、不合理的作业&…

【单片机/普中A2】学习笔记3-数码管

数码管主要概念 参考文献:点击前往 数码管分类 字形重叠数码管:将不同数字、字母与符号重叠,需要用到那个就显示那个 分段式数码管:最常见的数码管,按照笔画来显示,主要有七段式和八段式数码管 点矩阵式…

JavaScript 代码整洁之道

文章目录概述篇变量篇函数篇注释篇异常处理篇复杂判断函数篇重构篇参考资料概述篇 书写能让人读懂的代码使用英语编写代码团队协作 制定通用的规则,依靠工具让团队的代码风格保持统一,要让代码看起来是由一个人编写的,消除个人的代码风格。…

这么好看的客服组件,还是觉得接入ChatGPT,把它放在博客中那就完美了

我们在使用ChatGPT时,它的返回方式是采用流式回复。感觉这个效果不错。之前做的全都是的等全部结果请求完成,再一次性返回给用户。今天就通过流式回复的效果重写之前的程序。 前端 前端采用一个网页版的客服组件,整体的效果如下:…