GitLab CI Docker执行器下docker-compose exec -T调用Pytest不执行问题
解决方案
核心根因
你遇到的两种异常对应两个独立问题:
- 不带
-T参数报错the input device is not a TTY:GitLab CI的运行环境是非交互模式,默认没有分配伪终端,交互模式的exec命令自然无法执行 - 带
-T参数直接返回0:你的CI测试命令未指定pytest的测试目录,pytest未扫描到任何测试用例时会默认返回执行成功,本地带路径执行所以可以正常识别失败用例
修复步骤
首先补全CI中pytest的测试路径
修改test阶段的exec命令,补全你本地执行时的/app/tests/路径:- docker-compose -f docker-compose.ci.test.yml exec -T web_service pytest /app/tests/ --junitxml=report.xml(可选)验证测试目录是否存在
如果补全路径后依然异常,在pytest命令前增加目录校验命令,确认容器内的测试文件确实存在:- docker-compose -f docker-compose.ci.test.yml exec -T web_service ls -la /app/tests若输出无测试文件,需要检查你的
docker-compose.ci.test.yml是否正确挂载了测试目录,或是构建镜像时是否将测试代码打包进了镜像。(替代方案)使用docker-compose run替代exec
无需提前启动容器,直接用run命令执行测试,天然适配非交互的CI环境,无需处理TTY问题:test: stage: test script: - docker pull $MY_IMAGE # 直接跑测试,无需up -d启动服务 - docker-compose -f docker-compose.ci.test.yml run --rm web_service pytest /app/tests/ --junitxml=report.xml artifacts: when: always paths: - report.xml reports: junit: report.xml only: - master(可选)保留exec的修复方案
如果你一定要用exec执行命令,可以在docker-compose.ci.test.yml的web_service配置项中增加tty: true,为容器预分配伪终端,就可以去掉-T参数正常执行测试:services: web_service: image: ${MY_IMAGE} tty: true # 其余配置保持不变
内容的提问来源于stack exchange,提问作者Sean McCarthy
相关产品推荐
相关产品推荐

