Docker中运行的Express.js应用无法访问的解决方法
问题排查与解决
你的问题根源有两个,直接导致无法外部访问:
1. 环境变量格式错误
Dockerfile中ENV PORT = 3002的写法不符合规范,等号前后的空格会让环境变量PORT的实际值变成= 3002,这就是终端输出http://localhost:= 3002的原因。
修复方式:修改Dockerfile里的环境变量定义,去掉等号前后的空格:
FROM node:16-alpine WORKDIR /usr/src/app COPY package.json /usr/src/app RUN npm install COPY . . ENV PORT=3002 # 去掉等号前后空格 EXPOSE 3002 CMD ["npm", "start"]
2. 服务器绑定地址限制
Express默认将服务器绑定到localhost(仅容器内部可访问),即使做了端口映射,外部也无法穿透到容器内的localhost接口。
修复方式:修改server.ts的监听代码,把绑定地址改成0.0.0.0,让服务器接受所有网络接口的请求:
app.listen(port, '0.0.0.0', () => { console.log(`Server is running at http://0.0.0.0:${port}`); });
3. 重新构建并运行
修改完成后,重新构建镜像并启动容器:
npm run build-docker-image npm run docker-image
此时终端会正常输出Server is running at http://0.0.0.0:3002,你可以通过http://localhost:3001访问应用的端点。
内容的提问来源于stack exchange,提问作者sempraEdic
相关产品推荐
相关产品推荐

