我曾经做过一个项目,其结构与您的类似,它看起来像:
project
├── package.json
├── packages
│ ├── package1
│ │ ├── package.json
│ │ └── src
│ ├── package2
│ │ ├── package.json
│ │ └── src
│ └── package3
│ ├── package.json
│ └── src
├── services
│ ├── service1
│ │ ├── Dockerfile
│ │ ├── package.json
│ │ └── src
│ └── service2
│ ├── Dockerfile
│ ├── package.json
│ └── src
└── yarn.lock
The services/
文件夹的每个子文件夹包含一项服务。每个服务都是用node.js编写的,并且有自己的package.json和Dockerfile。
它们通常是基于 Express 的 Web 服务器或 REST API。
The packages/
文件夹包含所有非服务的包,通常是内部库。
一项服务可以依赖于一个或多个包,但不能依赖于另一项服务。
一个包可以依赖于另一个包,但不能依赖于服务。
主package.json(项目根文件夹下的package.json)仅包含一些devDependency,例如eslint
、测试运行者等
个人Dockerfile
看起来像这样,假设service1
取决于两者package1
& package3
:
FROM node:8.12.0-alpine AS base
WORKDIR /project
FROM base AS dependencies
# We only copy the dependencies we need
COPY packages/package1 packages/package1
COPY packages/package3 packages/package3
COPY services/services1 services/services1
# The global package.json only contains build dependencies
COPY package.json .
COPY yarn.lock .
RUN yarn install --production --pure-lockfile --non-interactive --cache-folder ./ycache; rm -rf ./ycache
实际上Dockerfile
我使用的更复杂,因为他们必须构建子包,运行测试等。但是您应该通过这个示例了解这个想法。
正如您所看到的,技巧是仅复制特定服务所需的包。
这yarn.lock
文件包含 package@version 的列表,其中包含确切的版本和已解决的依赖项。在不包含所有子包的情况下复制它不是问题,yarn 在安装所包含包的依赖项时将使用在那里解析的版本。
在您的情况下,react-native 项目永远不会成为任何 Dockerfile 的一部分,因为它不依赖于任何服务,从而节省了大量空间。
为了简洁起见,我在答案中省略了很多细节,如果有不清楚的地方,请随时在评论中要求精确。