Docker部署Node.js Serverless应用仅返回目录列表问题排查
问题分析与解决方案
核心问题原因
你看到容器输出目录列表,是因为Node.js执行了一个不存在的可执行文件或目录:当node命令后跟的路径是目录且没有找到默认入口文件(如index.js)时,就会自动输出该目录的结构。这说明你的脚本里$(npm bin)/sls在Docker环境中没有正确指向serverless的可执行文件,路径解析出了问题。
具体修复步骤
1. 替换脚本中的$(npm bin)/sls为npx sls
$(npm bin)的路径解析在不同shell环境(比如Docker容器默认的sh)下可能出现偏差,改用npx sls可以自动定位本地node_modules/.bin下的serverless命令,可靠性更高。修改package.json的scripts:
"scripts": { "dev": "node --inspect npx sls offline start", "docker": "npx sls offline start --host 0.0.0.0" }
2. 修正Serverless配置文件的语法错误
你的serverless.yml中把mysql配置放在了functions节点下,这是错误的,应该移到custom节点下,否则serverless框架无法正确解析配置,可能导致启动失败:
service: My Service frameworkVersion: '3' provider: name: aws runtime: nodejs14.x stage: dev environment: cowenv: dev custom: mysql: stages: - dev start: docker: true port: 8000 inMemory: true migrate: true seed: false convertEmptyValues: true noStart: true functions: my_test: name: test_func handler: lambda_funcs/test_func/index.handler events: - httpApi: path: /test method: get package: individually: true plugins: - serverless-offline
3. 优化Dockerfile(可选但推荐)
改用官方Node镜像替代手动安装Node,减少环境差异,同时用npm ci替代npm install,基于package-lock.json安装依赖更稳定:
FROM node:18-bookworm WORKDIR /app # 先复制依赖文件,利用Docker缓存 COPY package*.json ./ RUN npm ci # 再复制项目代码 COPY . . EXPOSE 3000 9229 CMD ["npm", "run", "docker"]
4. 验证依赖安装正确性(排查用)
如果问题仍存在,可以在Dockerfile中添加验证步骤,确认sls命令的路径:
RUN echo "Local sls path: $(npm bin)/sls" && ls -la $(npm bin)/sls
构建镜像时查看输出,确认sls是可执行文件而非目录。
内容的提问来源于stack exchange,提问作者jlan
相关产品推荐
相关产品推荐

