项目容器启动时MySQL端口检测的问题解决

 更新时间:2025年12月17日 10:25:22   作者:梓沂  
本文主要介绍了项目容器启动时MySQL端口检测的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

要解决容器启动时MySQL端口检测的问题,用脚本轮询并检测端口可用性是完全可行的。将下面的示例脚本替代Dockerfile或启动脚本中原来的sleep 15命令即可。

方案一:使用 netcat (nc) 命令轮询(推荐)

nc 是最常用且最可靠的工具。如果容器中没有,可以在构建镜像时安装。

检查端口脚本
将以下脚本保存到容器内(例如 /wait-for-mysql.sh)并赋予执行权限:

#!/bin/sh
# wait-for-mysql.sh

host="$1"
port="$2"
shift 2
cmd="$@"

echo "正在等待 MySQL ($host:$port) 启动..."

while ! nc -z $host $port; do
  sleep 3
done

echo "MySQL 已就绪,启动应用..."
exec $cmd

在启动命令中使用
修改你的Docker启动命令,替换掉原来的sleep 15

# 原命令 (使用睡眠):
# CMD nginx; echo "Waiting for MySQL to start..."; sleep 15; java -jar /app/api/app.jar ...

# 新命令 (使用轮询):
CMD nginx; /wait-for-mysql.sh mysql 3306 java -jar /app/api/app.jar --spring.profiles.active=prod --spring.datasource.url="jdbc:mysql://${DB_HOST}:${DB_PORT:-3306}/${DB_NAME}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true" --spring.datasource.username=${DB_USER} --spring.datasource.password=${DB_PASS} --sa-token.is-concurrent=${SA_TOKEN_IS_CONCURRENT:-false} --sa-token.jwt-secret-key=${SA_TOKEN_JWT_SECRET_KEY}

脚本逻辑:脚本会在 while 循环中每隔 sleep 3 秒,使用 nc -z 尝试连接 mysql:3306。成功后,再执行后面的Java启动命令 (exec $cmd)。

方案二:使用 bash 内置的 /dev/tcp(无需额外工具)

如果容器环境(如Alpine基础镜像)没有安装 nc,并且不便安装,可以利用bash内置的 /dev/tcp 伪设备。

检查端口脚本
将以下脚本保存到容器内:

#!/bin/bash
# wait-for-mysql-tcp.sh

host="$1"
port="$2"
shift 2
cmd="$@"

echo "正在等待 MySQL ($host:$port) 启动..."

until bash -c "(echo > /dev/tcp/$host/$port) >/dev/null 2>&1"; do
    sleep 3
done

echo "MySQL 已就绪,启动应用..."
exec $cmd

启动命令
修改启动命令,调用这个脚本,用法与方案一相同。

关键点说明

特性/方案使用 netcat (nc)使用 /dev/tcp
原理使用网络工具 nc 的 -z 参数进行端口扫描。利用 bash 的 /dev/tcp 伪文件系统进行 TCP 连接。
依赖需要安装 netcat-openbsd 或 nmap-ncat 包。仅依赖 bash(多数镜像已包含)。
优点语法标准,功能明确,最常用。无需额外安装任何包,脚本简洁。
潜在缺点部分极简基础镜像可能未预装。需要 Bash 环境,若容器使用 sh 可能不支持。

实施建议

  1. 选择方案:如果你的镜像基于 alpine,建议使用方案二(/dev/tcp),因为安装 nc 会增加镜像大小。如果是 ubuntudebian 等较完整的镜像,两个方案都可行,使用 nc 的命令更直观。
  2. 修改 Dockerfile:确保将上述脚本复制到镜像中,并在 CMD 指令中使用。
    # 以方案一为例,需在Dockerfile中安装nc并复制脚本
    FROM your-base-image
    # 安装netcat (例如在基于Debian的镜像中)
    RUN apt-get update && apt-get install -y netcat-openbsd && rm -rf /var/lib/apt/lists/*
    # 复制等待脚本
    COPY wait-for-mysql.sh /usr/local/bin/
    RUN chmod +x /usr/local/bin/wait-for-mysql.sh
    # 修改启动命令
    CMD ["sh", "-c", "nginx; wait-for-mysql.sh mysql 3306 java -jar /app/api/app.jar ..."]
    

这个方案能精确控制等待时机,解决了固定时间可能过长或过短的问题。如果你需要根据特定基础镜像(例如Alpine)调整Dockerfile的安装步骤,可以告诉我,我能提供更具体的修改建议。

到此这篇关于项目容器启动时MySQL端口检测的问题解决的文章就介绍到这了,更多相关MySQL端口检测内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SQL 列不同的表查询结果合并操作

    SQL 列不同的表查询结果合并操作

    这篇文章主要介绍了SQL 列不同的表查询结果合并操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • JDBC连接mysql8和mysql5.7的注意事项

    JDBC连接mysql8和mysql5.7的注意事项

    这篇文章主要介绍了JDBC连接mysql8和mysql5.7的注意事项,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 详解mysql中if函数的正确使用姿势

    详解mysql中if函数的正确使用姿势

    这篇文章主要介绍了详解mysql中if函数的正确使用姿势,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • mysql免安装版的实际配置方法

    mysql免安装版的实际配置方法

    本文主要向大家讲述的是MySQL 免安装版的实际配置方法,以及对其的相关的下载网址也有详细介绍,望你会有所收获。
    2010-08-08
  • MYSQL同步 Slave_IO_Running: No 或者Slave_SQL_Running: No的解决方法[已测]

    MYSQL同步 Slave_IO_Running: No 或者Slave_SQL_Running: No的解决方法[已测

    为了服务器更好的安全特将mysql服务器同步一下,show slave status\G出现了Slave_IO_Running: No 错误,特整理了下,方便以后配置
    2011-06-06
  • 浅谈MySQL数据同步到 Redis 缓存的几种方法

    浅谈MySQL数据同步到 Redis 缓存的几种方法

    本文主要介绍了浅谈MySQL数据同步到 Redis 缓存的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • MySQL的主键命名策略相关

    MySQL的主键命名策略相关

    这篇文章主要介绍了MySQL的主键命名策略的的相关资料,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2021-01-01
  • 两种mysql对自增id重新从1排序的方法

    两种mysql对自增id重新从1排序的方法

    本文介绍了两种mysql对自增id重新从1排序的方法,简少了对于某个项目初始化数据的工作量,感兴趣的朋友可以参考下
    2015-07-07
  • mysql自定义函数原理与用法实例分析

    mysql自定义函数原理与用法实例分析

    这篇文章主要介绍了mysql自定义函数,结合实例形式分析了mysql自定义函数基本功能、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • Ubuntu下MySQL中文乱码的问题解决

    Ubuntu下MySQL中文乱码的问题解决

    对于MySQL中文乱码问题(我的是Ubuntu系统),在网上看了很多解决方案,期间也走了不少弯路,所以想着根据自己的解决之路写一篇文章分享给有需要的朋友们,所以这篇文章主要介绍了如何解决Ubuntu下MySQL中文乱码问题的相关资料,需要的朋友可以参考借鉴。
    2017-02-02

最新评论