GitHub Actions环境下Node.js无法连接Docker MySQL数据库问题咨询
问题解决方案
连接地址说明
如果你的Node.js测试脚本直接运行在GitHub Actions的Ubuntu宿主机上(没有打包进自定义容器运行),在已经映射3306端口的前提下,数据库连接地址确实为127.0.0.1,不需要使用容器内网IP。如果你的测试是运行在自定义容器内,才需要使用服务名biddify-product-database作为数据库Host。
核心报错原因&修复方案
你遇到的连接失败大概率是以下两个问题导致的:
- 超时时间过短,且没有预留服务启动时间:MySQL容器首次启动需要执行初始化脚本、创建库表、启动服务,整个过程通常需要10~30秒。你当前设置的全局
timeout-minutes: 1时间过短,且启动容器后直接执行测试,数据库还未完成启动就接收连接请求,自然会报错。 - 数据库认证配置不匹配:你需要确认
robfontys/biddify-product-database镜像默认的数据库名、用户名、密码,和测试脚本中配置的参数一致,否则也会连接失败。
修正后的工作流配置
name: Node.js CI on: push: branches: [ master ] pull_request: branches: [ master ] jobs: build: runs-on: ubuntu-latest services: biddify-product-database: image: robfontys/biddify-product-database:latest ports: - 3306:3306 # 可选:如果需要覆盖镜像默认的数据库配置,可添加env字段 # env: # MYSQL_DATABASE: 你的库名 # MYSQL_USER: 你的用户名 # MYSQL_PASSWORD: 你的密码 # MYSQL_ROOT_PASSWORD: root账号密码 # 放宽超时时间,避免服务未启动就被强制终止 timeout-minutes: 5 strategy: matrix: node-version: [12.x, 14.x] steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} cache: 'npm' - run: npm ci - run: npm run build --if-present # 新增步骤:等待MySQL端口可访问后再执行测试 - name: 等待MySQL服务启动完成 run: | sudo apt-get install -y netcat until nc -z 127.0.0.1 3306; do echo "等待MySQL启动..." sleep 2 done # 可选:如果测试脚本从环境变量读取数据库配置,可在此处统一注入 # env: # DB_HOST: 127.0.0.1 # DB_PORT: 3306 # DB_USER: 你的用户名 # DB_PASSWORD: 你的密码 # DB_NAME: 你的库名 - run: npm test
额外注意事项
- 确认你的MySQL镜像没有默认绑定
127.0.0.1,如果存在该配置,容器外部将无法访问,需要修改镜像内的MySQL配置允许外部访问。 - 建议测试代码不要写死数据库配置,优先从环境变量读取,方便适配CI等不同运行环境。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

