Github Actions中Dockerfile能否使用WORKDIR?解决Jest「No tests found」报错
问题核心根因是GitHub Actions的Docker运行流程会默认将宿主机的仓库目录挂载到容器内的同名路径,并覆盖容器运行时的工作目录,导致Jest默认扫描的路径与你预期的、Dockerfile中
WORKDIR指定的代码存放路径不匹配,因此找不到测试文件。
可行方案(均保留Dockerfile的WORKDIR设置)
以下示例中/app为Dockerfile中WORKDIR的实际路径,请根据你的配置替换。
1. 运行容器时显式指定Jest的扫描根目录
Jest支持通过--rootDir参数直接指定测试文件的扫描根目录,优先级高于所有配置文件与运行时工作目录。直接修改测试执行命令即可,无需改动其他配置:
docker run <temp_image> npm test -- --coverage --rootDir=/app
该方案直接绕过运行时工作目录的干扰,是改动成本最低的方案。
2. 运行容器时显式挂载代码到WORKDIR路径
如果你的镜像仅内置依赖、代码需要运行时挂载(旧CI大概率是隐式执行了该挂载逻辑),则需要同时添加挂载与工作目录指定参数。此前单独使用-w指定工作目录失败,是因为容器内的/app路径没有挂载实际代码:
docker run -v $GITHUB_WORKSPACE:/app -w /app <temp_image> npm test -- --coverage
该方案完全贴合Docker的目录约定,/app下会同时存在挂载的业务代码与镜像内置的node_modules依赖,Jest可正常扫描测试文件。
3. 在Dockerfile中固化切目录逻辑
如果需要避免运行时重复指定参数,可直接在Dockerfile中修改启动逻辑,确保容器启动时强制切换到WORKDIR路径,不受GitHub Actions的工作目录覆盖影响:
FROM node:18 # 保留原有WORKDIR设置,符合Docker最佳实践 WORKDIR /app # 原有构建步骤(COPY代码、npm ci等)保持不变 # 修改ENTRYPOINT,强制启动时先切换到WORKDIR路径 ENTRYPOINT ["/bin/sh", "-c", "cd /app && exec \"$@\"", "--"] # 原有CMD配置保持不变 CMD ["npm", "test", "--", "--coverage"]
该方案将目录逻辑固化在镜像中,所有环境下运行都可保证工作目录为预期路径。此前尝试的/bin/sh (cd /app && npm test)写法存在语法问题,会导致命令执行失败,上述写法为标准可执行格式。
4. 覆盖GitHub Actions注入的GITHUB_WORKSPACE环境变量
如果你的Jest配置或业务脚本中引用了GITHUB_WORKSPACE变量作为扫描根目录,可在运行docker run时显式覆盖该环境变量为你的WORKDIR路径,避免GitHub注入的宿主机路径干扰:
docker run -e GITHUB_WORKSPACE=/app <temp_image> npm test -- --coverage
内容的提问来源于stack exchange,提问作者Duncan Brain

