如何让 docker 和 npm 工作区正常工作,而无需到处复制根主节点模块

rea*_*tor 18 node.js npm docker

我有一个像这样的项目结构:

+-- node_modules
+-- package-lock.json
+-- package.json
`-- workspace-a
   `-- package.json <---includes common as a dependency
`-- common
   `-- package.json
Run Code Online (Sandbox Code Playgroud)

我有Dockerfile如下:

FROM node:alpine as builder

# from monorepo root
WORKDIR /app

COPY ./package*.json ./

COPY ./common/package*.json ./common/

COPY ./workspace-a/package*.json ./workspace-a/

RUN npm config set optional

RUN npm i

# build common library
WORKDIR /app/common

COPY ./common ./

RUN npm run build

# build workspace-a using built common library as dependency
WORKDIR /app/workspace-a

COPY ./auth ./

CMD ["npm","run", "build"]

FROM node:alpine
ENV CI=true

WORKDIR /app

COPY --from=builder /app/workspace-a/build .

COPY ./workspace-a/package*.json .

# RUN npm i --only=prod <--- this step will complain about "common" not being available, but added it just to try it

CMD ["npm","start"]
Run Code Online (Sandbox Code Playgroud)

我想知道如何避免将 复制到将使用它node_modules的每个容器,我相信这是所有依赖项的一个巨大的综合文件夹,消除了子模块拥有自己单独的文件夹的需要node_modules。例如,我计划workspace-b最终添加一个,它也将有自己的Dockerfile,或多或少与workspace-a上面所示的相同。

090*_*9EM -5

如果您想在执行此操作时停止node_modules复制文件夹

COPY ./common ./
Run Code Online (Sandbox Code Playgroud)

然后你想要一个.dockerignore包含 docker 应忽略的目录的文件,在这种情况下该文件将只包含:

node_modules
Run Code Online (Sandbox Code Playgroud)

请参阅此页面了解信息