Docker部署AWS Lambda TS项目本地环境代码热更新问题求助
解决Lambda本地Docker容器代码自动更新问题
Lambda容器启动时会将/var/task目录下的代码加载到内存缓存,即便挂载的dist目录文件更新,容器也不会主动重新加载缓存的代码,必须重启才能读取新文件。以下是几种可行的解决方案:
方案1:给Lambda容器添加文件监听重启机制
通过在Lambda容器中安装文件监听工具nodemon,监听/var/task目录变化,自动重启Lambda执行进程。
构建自定义Lambda镜像
创建Dockerfile.lambda文件:FROM public.ecr.aws/lambda/nodejs:22 RUN npm install -g nodemon修改docker-compose.yml配置
更新lambda服务的构建方式与启动命令:services: lambda: build: context: . dockerfile: Dockerfile.lambda volumes: - ./dist:/var/task ports: - "9000:8080" command: nodemon --watch /var/task --exec "aws-lambda-rie node dist/index.handler"优化监听规则(可选)
在项目根目录创建nodemon.json,排除不需要监听的文件:{ "watch": ["/var/task"], "ignore": ["/var/task/node_modules"], "ext": "js,json" }
方案2:通过esbuild编译回调触发Lambda容器重启
利用esbuild的--onSuccess参数,在每次编译完成后自动重启lambda容器,无需在Lambda容器中额外安装工具。
修改esbuild命令
更新package.json中的build脚本:{ "scripts": { "build:watch": "esbuild src/index.ts --bundle --platform=node --target=node22 --outfile=dist/index.js --watch --onSuccess \"docker-compose restart lambda\"" } }给builder容器挂载docker sock
确保builder容器能访问宿主机的docker命令,在docker-compose.yml的builder服务中添加:services: builder: image: node:22 volumes: - /var/run/docker.sock:/var/run/docker.sock - ./src:/app/src - ./dist:/app/dist working_dir: /app command: npm run build:watch
方案3:使用Lambda Web Adapter实现HTTP服务热重载
如果你的Lambda函数是HTTP触发类型,可以使用Lambda Web Adapter将其转为HTTP服务,同时支持热重载:
安装Lambda Web Adapter依赖
在项目中添加相关依赖,并修改代码将函数暴露为HTTP服务。配置容器启动命令
使用nodemon监听代码变化,重启Web Adapter服务,确保每次代码更新后自动重新加载。
内容的提问来源于stack exchange,提问作者viko
相关产品推荐
相关产品推荐

