You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:24:59