Bitbucket Pipeline中Java集成测试无法访问MariaDB容器的排查与解决
问题分析与解决
你的JDBC地址格式本身没问题,但连接失败的核心原因是Bitbucket流水线执行环境与Docker容器的网络隔离:
- 流水线里的
mvn命令运行在Bitbucket提供的主机容器中,这里的localhost指的是这个主机容器本身,而非你启动的MariaDB容器。 - 你启动的MariaDB容器默认运行在Docker守护进程的独立网络空间,没有把端口暴露给主机容器,因此主机容器无法通过
localhost:3306访问到它。
具体解决步骤
1. 给MariaDB容器添加端口映射
修改docker run命令,加上-p 3306:3306参数,将容器的3306端口映射到主机容器的3306端口:
docker run --detach --name some-mariadb -p 3306:3306 --env MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1 --env MARIADB_DATABASE=test mariadb:latest
2. 等待MariaDB服务完全就绪
容器启动后,MariaDB需要几秒初始化时间,直接执行测试会因服务未就绪导致连接失败。添加等待脚本,确认数据库可正常响应后再跑测试:
# 循环检测MariaDB服务状态,直到就绪 until docker exec some-mariadb mysqladmin ping -h "localhost" --silent; do echo "等待MariaDB启动中..." sleep 2 done
3. 修改后的完整流水线脚本
learn-pipeline: - step: name: purpose merely learning about how pipeline is working services: - docker script: - docker run --detach --name some-mariadb -p 3306:3306 --env MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1 --env MARIADB_DATABASE=test mariadb:latest - docker ps # 等待MariaDB服务就绪 - until docker exec some-mariadb mysqladmin ping -h "localhost" --silent; do echo "等待MariaDB启动中..." sleep 2 done - mvn clean verify
补充说明
- 完成上述修改后,你的JDBC地址
jdbc:mysql://localhost:3306/test完全可用,因为端口映射已经将容器的数据库端口暴露给了主机容器的localhost。 - 若不想用端口映射,也可创建Docker自定义网络,将主机容器与MariaDB容器加入同一网络,此时JDBC地址可改为
jdbc:mysql://some-mariadb:3306/test(用容器名作为主机名),但在Bitbucket流水线中,端口映射的方式更简单直接。
内容的提问来源于stack exchange,提问作者Rui
相关产品推荐
相关产品推荐

