You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:30:55