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

docker-compose环境下Node.js测试无法访问Java服务问题求助

问题排查与修复方案

1. Dockerfile依赖安装逻辑错误,测试依赖丢失

当前Dockerfile的执行顺序存在严重逻辑问题:

  • 你先执行npm install安装测试依赖,之后才复制package.json到容器内,最后又执行了npm install --production
  • 同时你配置了ENV NODE_ENV=production,npm install --production会完全忽略devDependencies类依赖,会直接覆盖/清除你之前单独安装的mocha、chai等测试工具,导致测试脚本执行时找不到依赖报错。

修复方案:调整Dockerfile执行顺序,修改为如下内容:

FROM timbru31/java-node
WORKDIR /app
# 先复制包配置文件
COPY ["package.json", "package-lock.json*", "./"]
# 安装所有依赖(包含测试依赖,无需单独逐个安装)
RUN npm install
# 复制其余项目文件
COPY . .
# 提前给wait-for-it.sh添加执行权限,避免无权限运行
RUN chmod +x wait-for-it.sh
CMD [ "java", "-jar" , "test-engineer-exercise-0.0.1.jar"]

如果需要保留生产环境配置,可以单独给测试服务设置环境变量NODE_ENV=test覆盖全局配置。

2. 测试脚本请求地址不匹配容器网络

本地运行测试时你请求的是localhost:8080,但在Docker Compose的overlay网络下,测试服务要访问web服务必须用服务名作为域名,正确请求地址是http://web:8080。

修复方案:修改测试代码里的请求地址,将固定写死的localhost:8080改为可通过环境变量读取的配置,测试服务启动时传入API_HOST=http://web:8080即可。

3. 端口就绪不代表服务完全可用

wait-for-it.sh仅能检测8080端口是否开放,但Java应用(尤其是SpringBoot这类重型框架)端口开放后还需要几秒加载上下文、初始化接口,此时发起请求会直接报错。

修复方案:

  • 在端口检测后增加几秒延时,修改test服务的command为["./wait-for-it.sh", "web:8080", "--", "sh", "-c", "sleep 5 && npm test"]
  • 或者编写简易探活脚本,循环请求web服务的健康检查接口直到返回200状态码后再执行测试。

4. wait-for-it.sh运行环境缺失

大部分版本的wait-for-it脚本依赖bash运行,若基础镜像中没有预装bash会导致脚本执行失败,直接跳过等待环节执行测试,此时web服务还未完全启动。

修复方案:

  • 确认使用的wait-for-it脚本支持sh解析,或者在Dockerfile中添加bash安装步骤RUN apt update && apt install -y bash
  • 或者替换为更轻量的sh兼容等待脚本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 22:54:03