Jenkins流水线连接MySQL Docker容器失败问题排查求助
遇到过几乎一模一样的问题,给你几个实用的排查方向:
先确认连接地址的端口是否正确:你的容器是把宿主机的
3360端口映射到容器内的3306,所以Jenkins流水线里的JDBC URL必须指定3360端口,比如jdbc:mysql://localhost:3360/your_db_name?useSSL=false。很多人会习惯性写成3306,这肯定连不上,先检查这个最基础的点。验证MySQL容器内的绑定地址:进入容器执行命令
docker exec -it mysql mysql -u root -p -e "SHOW VARIABLES LIKE 'bind_address';",查看输出结果。如果是127.0.0.1,说明MySQL只监听容器内部的回环地址,宿主机无法访问,需要修改容器启动参数,加上--bind-address=0.0.0.0,或者修改容器内的my.cnf配置(通常在/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),把bind-address改成0.0.0.0后重启容器。检查MySQL用户的访问权限:本地能连可能是用了
localhost或127.0.0.1的用户,但Jenkins连接时如果用的是宿主机IP或者容器IP,需要确保用户有对应的访问权限。进入MySQL执行SELECT user, host FROM mysql.user;,如果你的用户对应的host是localhost,那只能本地连接,需要授权允许远程访问:GRANT ALL PRIVILEGES ON your_db.* TO 'your_user'@'%' IDENTIFIED BY 'your_password'; FLUSH PRIVILEGES;这里的
%表示允许任何IP访问,也可以指定Jenkins所在宿主机的IP。在宿主机直接测试连接:登录到Jenkins所在的宿主机,用命令行工具测试连接:
mysql -h localhost -P 3360 -u your_user -p,输入密码后看能不能连上。如果命令行能连但Jenkins流水线里连不上,那问题出在Jenkins环境上:- 检查JDBC驱动版本:MySQL 5.6需要用
mysql-connector-java 5.1.x系列的驱动,如果用了8.0.x的驱动,会有兼容性问题,比如认证方式不匹配,此时可以在JDBC URL里加上&allowPublicKeyRetrieval=true&useLegacyDatetimeCode=true,或者降级到5.1.x的驱动。 - 检查Jenkins的环境变量:确认流水线里的用户名、密码、数据库名等参数是否正确,比如有没有把凭据ID写错,导致获取的密码不对。可以在流水线里临时打印部分连接参数(注意不要泄露密码),比如
echo "JDBC URL: jdbc:mysql://localhost:3360/${DB_NAME}"来验证。
- 检查JDBC驱动版本:MySQL 5.6需要用
检查宿主机的端口占用和防火墙:用
ss -tulpn | grep 3360确认宿主机的3360端口确实被docker-proxy监听。如果没找到,说明容器的端口映射没生效,需要重新启动容器。另外,检查宿主机的防火墙规则(比如ufw status或iptables -L),确保3360端口没有被禁止入站(虽然是宿主机内部访问,但有些严格的规则可能会限制)。
内容的提问来源于stack exchange,提问作者user1990218

