无法通过Curl访问Chainguard Node容器中运行的Fastify服务器
问题:基于Chainguard Node镜像的Fastify服务容器运行正常但本地无法访问
容器运行状态显示正常:
- 服务器监听地址:http://[::1]:80
- 进程ID:7
但访问localhost无响应,使用curl localhost也没有返回结果。
提供的代码
Dockerfile(第三阶段构建)
# ... # 3rd part of build layer FROM cgr.dev/chainguard/node:latest ENV PATH=/app/node_modules/.bin:$PATH WORKDIR /app # /app/node_modules COPY --from=build-deps --chown=node:node /usr/src/app . # /app/dist/node-server.js COPY --from=build-dist --chown=node:node /usr/src/app/dist dist ENV NODE_ENV=production EXPOSE 80 ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["node", "dist/node-server.js"]
node-server.js
import Fastify from "fastify"; const server = Fastify(); server.get("/", (req, res) => { res.send({ message: "Success" }); }); const closeGracefully = async (signal) => { console.log(`Received signal to terminate: ${signal}`) await server.close() process.kill(process.pid, signal); } process.once('SIGINT', closeGracefully) process.once('SIGTERM', closeGracefully) const init = async () => { try { server.listen({ port: 80 }, (err, address) => { if (err) { console.error(err); process.exit(1); } console.log(`Server listening at ${address}`); }); console.log(`Process id: ${process.pid}`); } catch (err) { server.log.error(err); process.exit(1); } }; init();
问题原因与解决方法
核心问题
服务器监听的地址是[::1](IPv6回环地址),容器内部的回环地址无法被宿主机访问。在容器环境中,服务必须监听所有网络接口(0.0.0.0或::),才能让宿主机通过端口映射访问到服务。
修复步骤
修改node-server.js中的server.listen配置,添加host参数为'0.0.0.0'(同时支持IPv4和IPv6可设为'::'):
server.listen({ port: 80, host: '0.0.0.0' }, (err, address) => { if (err) { console.error(err); process.exit(1); } console.log(`Server listening at ${address}`); });
验证与补充
- 重新构建镜像并启动容器,此时服务器会监听
http://0.0.0.0:80,宿主机可通过localhost:映射端口访问(若启动容器时用了-p 80:80,直接访问localhost即可)。 - 确认启动容器时已正确配置端口映射,示例命令:
docker run -p 80:80 your-image-name
内容的提问来源于stack exchange,提问作者Inspiraller
相关产品推荐
相关产品推荐

