如何使用Postman本地测试Docker内的Serverless Offline接口
问题描述
我的环境配置如下:
我后端采用基于Node.js的Serverless Framework,当前尝试构建Docker镜像,通过serverless-offline插件在本地运行Serverless服务。
Docker配置
FROM public.ecr.aws/lambda/nodejs:10 # Set the working directory of the docker image WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3001 ENTRYPOINT [ "./node_modules/serverless/bin/serverless", "offline", "start", "--port", "3001", "--stage", "prerelease","--host", "0.0.0.0", "--noauth" ] CMD ["lib/functions/generateDoc/index.handler"]
执行命令 docker run -p 3001:3001 -it docdownload 后,控制台输出如下:
Serverless: Starting Offline: prerelease/us-west-2. Serverless: Routes for generateDoc: Serverless: POST /exportDoc Serverless: WARNING: Serverless Offline does not support non local authorizers (authorizerId): [object Object] Serverless: POST /{apiVersion}/functions/doc-api-prerelease-generateDoc/invocations Serverless: Offline [HTTP] listening on http://localhost:3001 Serverless: Enter "rp" to replay the last request
从日志可见服务已在3001端口监听,生成了POST /exportDoc路由,但我使用Postman发起接口请求时出现访问异常:
请问如何正确通过Postman本地测试该Docker容器中运行的服务接口?
回答
问题根因
容器内的serverless-offline服务默认绑定了容器内部的127.0.0.1地址,没有正确监听0.0.0.0,导致宿主机无法通过映射的端口访问服务。核心原因是Dockerfile中ENTRYPOINT和CMD的组合写法错误,多余的handler路径参数打乱了启动参数解析,--host 0.0.0.0和--noauth参数均未生效。
解决步骤
- 修改Dockerfile配置
去掉CMD中多余的handler路径参数,该参数是serverless.yml中配置的函数入口,不需要在启动命令末尾追加。修改后的启动配置如下:FROM public.ecr.aws/lambda/nodejs:10 # Set the working directory of the docker image WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3001 # 如需仅启动generateDoc单个函数,可在参数中追加 --function generateDoc ENTRYPOINT [ "./node_modules/serverless/bin/serverless", "offline", "start", "--port", "3001", "--stage", "prerelease","--host", "0.0.0.0", "--noauth" ] CMD [] - 重新构建镜像
在Dockerfile所在目录执行命令:docker build -t docdownload . - 启动容器
执行端口映射启动命令:
启动后查看容器日志,确认监听地址显示为docker run -p 3001:3001 -d docdownloadhttp://0.0.0.0:3001即代表绑定正确,之前的非本地authorizer警告不影响--noauth参数生效,可直接忽略。 - Postman请求配置
- 请求方法选择
POST - 请求地址填写
http://localhost:3001/exportDoc - 无需配置任何鉴权相关请求头
- 若接口需要JSON格式入参,在Body栏选择
raw格式,右侧下拉选JSON,填入对应请求参数即可发起调用。
- 请求方法选择
连通性排查
如果按上述步骤配置后仍无法访问,先在宿主机执行以下命令验证端口连通性:
curl -v http://localhost:3001/exportDoc
- 如果提示连接拒绝,回到容器日志确认监听地址是否为0.0.0.0,同时检查本机3001端口是否被其他进程占用
- 如果返回404,核对日志中打印的路由列表,确认
/exportDoc路由是否正确注册
内容的提问来源于stack exchange,提问作者vam
相关产品推荐
相关产品推荐

