Я работал над проектом, следуя структуре, похожей на вашу, это выглядело так:
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
Папка services/
содержит один сервис для каждой подпапки. Каждый сервис написан на node.js и имеет свой собственный package.json и Dockerfile.
Обычно это веб-сервер или REST API на основе Express.
Папка packages/
содержит все пакеты, которые не являются службами, обычно это внутренние библиотеки.
Услуга может зависеть от одного или нескольких пакетов, но не от другой услуги.
Пакет может зависеть от другого пакета, но не от службы.
Основной package.json (тот, что находится в корневой папке проекта) содержит только некоторые devDependencies, такие как 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
s, которые я использовал, были более сложными, так как они должны были создавать подпакеты, запускать тесты и т. Д. Но вы должны понять с этим примером.
Как видите, хитрость заключалась в том, чтобы копировать только те пакеты, которые необходимы для конкретной службы.
Файл yarn.lock
содержит список package @ version с точной версией и разрешенными зависимостями. Чтобы скопировать его без всех подпакетов, это не проблема, yarn будет использовать версию, разрешенную там, при установке зависимостей включенных пакетов.
В вашем случае реактивный проект никогда не будет частью какого-либо Dockerfile, так как он не зависит ни от одного из сервисов, что экономит много места.
Для краткости, в этом ответе я пропустил много деталей, не стесняйтесь спрашивать о точности в комментарии, если что-то не совсем понятно.