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
相关产品推荐
相关产品推荐

