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里,比如在环境变量中设置:
同时删掉database字段。TEST_DATABASE_URL=postgresql://${RDS_USERNAME}:${RDS_PASSWORD}@${RDS_HOSTNAME}:${RDS_PORT}/testing${TEST_ENV_NUMBER}
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
相关产品推荐
相关产品推荐

