Monorepo项目中Shared文件夹与Docker部署的依赖问题排查
问题根源
你在./project1目录执行docker compose up时,Docker的构建上下文默认是当前project1目录,上级的shared文件夹不在这个上下文范围内——不管是构建阶段的ADD . /app,还是运行时的卷挂载- .:/app,都没法把shared目录带入容器,导致容器里找不到../shared这个路径。
解决方案一:调整构建上下文(推荐,适配构建+运行全阶段)
1. 修改docker-compose.yml的构建配置
把构建上下文切换到Monorepo根目录,同时指定project1里的Dockerfile路径:
services: mongo: # ... 保持原有配置不变 my-api: build: context: .. # 构建上下文改为Monorepo根目录 dockerfile: ./project1/Dockerfile # 指定project1中的Dockerfile位置 image: my-api restart: always ports: - 3001:3001 volumes: - ./project1:/app # 挂载project1目录到容器/app - ./shared:/shared # 挂载shared目录到容器/shared(对应/app/../shared) depends_on: - mongo networks: - api-net environment: - TZ=Europe/Paris # ... 其他网络、卷配置不变
2. 更新Dockerfile的复制逻辑
因为构建上下文变成了Monorepo根目录,需要明确复制project1和shared目录到容器对应位置:
FROM node:lts-slim ENV TZ=Europe/Paris # 复制project1到容器/app,复制shared到容器/shared COPY ./project1 /app COPY ./shared /shared WORKDIR /app RUN npm install EXPOSE 3001 CMD npm run dev
这样容器里/app的上级目录就是/,/shared正好对应../shared的路径,满足package.json里的依赖配置。
解决方案二:开发环境临时挂载(无需修改构建上下文)
如果只是开发阶段需要快速调试,不想调整构建上下文,可以直接在docker-compose.yml的volumes里添加shared目录的挂载:
services: my-api: # ... 其他配置不变 volumes: - .:/app - ../shared:/app/../shared # 将本地shared目录挂载到容器内的对应路径 # ...
这种方式不用重新构建镜像,适合开发时实时同步代码,但生产构建时还是建议用方案一,确保镜像包含完整的依赖内容。
额外提示
- 确认
shared目录下存在合法的package.json,否则npm install会无法处理本地依赖。 - 方案一构建的镜像会包含
shared目录的内容,适合生产环境部署;方案二更偏向开发阶段的快速迭代。
内容的提问来源于stack exchange,提问作者Serol Tech
相关产品推荐
相关产品推荐

