Docker内执行Laravel测试报错无法打开phpunit文件如何调试
Docker容器内执行PHPUnit报文件不存在的调试与修复
问题复现
部署脚本如下,用于GitLab CI中通过docker-compose进入php8容器执行Laravel项目部署流程:
docker-compose -p project exec php8 bash -c ' composer install --working-dir="dashboard" && wp acorn config:clear --allow-root && wp acorn view:clear --allow-root && wp acorn optimize:clear --allow-root && wp rewrite flush --allow-root && php dashboard/artisan migrate && php dashboard/artisan optimize:clear && php vendor/phpunit/phpunit/phpunit --testsuite=Feature'
执行到测试步骤时抛出固定错误:
Could not open input file: vendor/phpunit/phpunit/phpunit
手动排查时通过ls确认phpunit文件存在于对应路径,但脚本始终无法找到该文件。
问题根因
核心问题是相对路径的执行基准目录不匹配:
- 你给composer加了
--working-dir="dashboard"参数,所有依赖(包括phpunit)都会被安装到dashboard子目录下的vendor文件夹中,phpunit真实路径为dashboard/vendor/phpunit/phpunit/phpunit - docker exec执行命令时,默认以容器内置的WORKDIR(通常是项目根目录,不是dashboard子目录)作为当前工作目录
- 你写phpunit路径时没有加
dashboard/前缀,相当于在根目录下找vendor文件夹,自然找不到文件 - 手动ls能看到文件,通常是因为你查看时主动进入了dashboard目录,或者在宿主机对应路径查看,没有对齐脚本执行时的目录上下文
调试定位步骤
按顺序执行以下操作即可快速定位问题:
- 在phpunit执行命令前插入路径打印命令,确认执行上下文
CI执行日志输出后,就能直接看到当前所在目录、根目录下是否存在vendor文件夹、dashboard目录下的phpunit是否真实存在# 插入到phpunit命令之前 pwd # 打印当前工作目录 ls -la # 打印当前目录下的文件结构 ls -la dashboard/vendor/phpunit/phpunit/ # 确认dashboard下phpunit文件是否存在 - 直接验证修正后的路径是否可用
临时把phpunit命令改成php dashboard/vendor/phpunit/phpunit/phpunit --version,如果能正常输出版本号,就100%确认是路径写错了 - 检查composer install的安装范围
只要composer指定了working-dir为dashboard,根目录下就不会生成vendor文件夹,所有依赖都在dashboard子目录下
修复方案
二选一即可,根据你的项目目录结构调整:
- 保持现有执行逻辑,只修正phpunit的路径,和artisan命令保持一致的前缀
docker-compose -p project exec php8 bash -c ' composer install --working-dir="dashboard" && wp acorn config:clear --allow-root && wp acorn view:clear --allow-root && wp acorn optimize:clear --allow-root && wp rewrite flush --allow-root && php dashboard/artisan migrate && php dashboard/artisan optimize:clear && php dashboard/vendor/phpunit/phpunit/phpunit --testsuite=Feature' - 执行完根目录下的wp命令后,切换到dashboard目录再执行后续Laravel相关命令,避免反复写路径前缀
docker-compose -p project exec php8 bash -c ' composer install --working-dir="dashboard" && wp acorn config:clear --allow-root && wp acorn view:clear --allow-root && wp acorn optimize:clear --allow-root && wp rewrite flush --allow-root && cd dashboard && php artisan migrate && php artisan optimize:clear && php vendor/phpunit/phpunit/phpunit --testsuite=Feature'
注意:如果wp命令是安装在dashboard目录下的,你可以直接把
cd dashboard放到composer install之前,所有命令都不用再写dashboard前缀。
内容的提问来源于stack exchange,提问作者fefe
相关产品推荐
相关产品推荐

