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

Docker中parallel_test gem无法创建数据库,TEST_ENV_NUMBER未获取

解决Docker环境下parallel_test无法获取TEST_ENV_NUMBER的问题

1. 确保parallel_test在容器内正确传递环境变量

parallel_test会自动设置TEST_ENV_NUMBER,但Docker容器默认不会自动传递子进程环境变量,得调整启动方式:

  • 写个测试启动脚本entrypoint-test.sh,用shell上下文执行命令:
    #!/bin/bash
    set -e
    bundle install
    # 等待数据库就绪(后续步骤会补充)
    until pg_isready -h $RDS_HOSTNAME -p $RDS_PORT -U $RDS_USERNAME; do
      echo "等数据库启动..."
      sleep 2
    done
    bundle exec parallel_test spec/
    
    然后在docker-compose.yml里配置:
    services:
      test:
        build: .
        entrypoint: ./entrypoint-test.sh
        environment:
          - RAILS_ENV=test
          - RDS_USERNAME=你的用户名
          - RDS_PASSWORD=你的密码
          - RDS_HOSTNAME=db
          - RDS_PORT=5432
        depends_on:
          - db
    
  • 嫌脚本麻烦的话,直接用shell执行命令:
    command: bash -c "bundle exec parallel_test spec/"
    

2. 修复database.yml的配置冲突

你的test环境同时配置了url和database/username等字段,PostgreSQL适配器会优先用url,导致testing<%= ENV['TEST_ENV_NUMBER'] %>不生效:

  • 方案一:删掉url: <%= ENV['TEST_DATABASE_URL'] %>,保留单独的database、username、host等配置;
  • 方案二:把TEST_ENV_NUMBER嵌入到TEST_DATABASE_URL里,比如在环境变量中设置:
    TEST_DATABASE_URL=postgresql://${RDS_USERNAME}:${RDS_PASSWORD}@${RDS_HOSTNAME}:${RDS_PORT}/testing${TEST_ENV_NUMBER}
    
    同时删掉database字段。

3. 确保数据库服务完全就绪

Docker的depends_on只保证容器启动,不确保数据库能正常连接。一定要在测试前加等待逻辑(上面的脚本已经包含,记得在Docker镜像里装postgresql-client,不然pg_isready命令不存在)。

4. 手动指定环境变量调试

如果还是不行,直接在命令里强制传递变量测试:

bundle exec parallel_test spec/ --env TEST_ENV_NUMBER='%p'

这里%p是parallel_test的占位符,会自动替换成进程编号(1、2...)。

5. 对齐parallel_test版本

确保Docker镜像里的parallel_test版本和本地一致,不同版本可能有环境变量传递的差异,直接用Gemfile.lock锁定版本就行。


内容的提问来源于stack exchange,提问作者Muhammad Moiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:05:10