Docker-compose启动后NestJS容器dist文件消失的解决求助
问题解决:NestJS Docker容器中dist文件丢失、SWC编译失败
问题根源
- 挂载目录覆盖容器产物:docker-compose中直接将本地
./backend挂载到容器/app,导致容器构建阶段生成的dist目录被本地无dist的目录覆盖,启动时找不到编译产物。 - Watch模式的目录冲突:
npm run dev使用--watch+SWC编译时,会监听文件变化并重新生成dist,但挂载的本地目录会干扰容器内的文件生成/同步,导致dist文件消失。
解决方案
方案1:调整挂载策略,保护容器内的依赖和编译产物
修改docker-compose.yml的volumes配置,仅挂载需要热重载的src目录,用匿名卷保留容器内的node_modules和dist,避免被本地目录覆盖:
version: '3.5' services: backend: build: context: ./backend dockerfile: Dockerfile container_name: backend ports: - '3001:3001' volumes: - ./backend/src:/app/src # 仅挂载src实现代码热重载 - /app/node_modules # 匿名卷保留容器内的依赖包 - /app/dist # 匿名卷保留容器内的编译产物 depends_on: - database database: image: mongo:6.0 container_name: mongodb restart: always ports: - '27017:27017' environment: MONGO_INITDB_ROOT_USERNAME: 'XXX' MONGO_INITDB_ROOT_PASSWORD: '1234'
方案2:优化Dockerfile(可选,提升权限安全性)
添加非root用户配置,避免容器内权限问题导致文件生成失败:
FROM node:18-alpine # 创建非root用户组和用户 RUN addgroup -S appgroup && adduser -S appuser -G appgroup # 缓存依赖,提升构建速度 COPY package.json /tmp/package.json RUN cd /tmp && npm install RUN mkdir -p /app && cp -a /tmp/node_modules /app WORKDIR /app COPY . . # 修正目录权限 RUN chown -R appuser:appgroup /app # 切换到非root用户 USER appuser # 构建编译产物 RUN npm run build CMD [ "npm", "run", "dev" ]
验证步骤
- 重新构建镜像:
docker-compose build - 启动容器:
docker-compose up -d - 查看容器日志:
docker logs -f backend,确认无找不到/dist/main的报错 - 修改本地
src目录下的代码,检查容器日志是否触发自动重新编译,验证热重载正常
内容的提问来源于stack exchange,提问作者CCCC
相关产品推荐
相关产品推荐

