Как создавать образы докеров в lerna monorepo без публикации

Пример использования - создание веток и развертывание в Lerna monorepos.

Проблема в том, что Lerna monorepos либо поднимает зависимости в NPM, либо использует рабочие области yarn с тем же эффектом для сбора всех зависимостей в папке node_modules рабочего пространства / monorepo. Это означает, что они не будут доступны при сборке файлов Docker в подпапках из-за того, как работают контексты сборки Docker.

Я полагаю, что здесь нужна некая «нижняя» функция (в отличие от подъема) для извлечения зависимостей пакетов в node_modules проекта Docker / package.json перед запуском сборки docker.

Вопрос в том, есть ли у кого-нибудь идея получше или знает ли уже существующий метод для этого?


person Gudlaugur Egilsson    schedule 13.12.2019    source источник
comment
Подход, который я использовал, - это публикация локальных зависимостей на локальном сервере npm (verdaccio) и создание файла Docker в каждом пакете, который необходимо собрать, и запуск сборки докеров с использованием параметра -f и установка каждого с использованием локального сервера npm.   -  person user2473015    schedule 01.01.2020
comment
Я рассматривал этот вариант. Довольны ли вы сложностью и скоростью этого подхода?   -  person Gudlaugur Egilsson    schedule 02.01.2020
comment
Мы используем этот метод: stackoverflow.com/questions/56294568/   -  person Felix    schedule 03.01.2020


Ответы (2)


Для моего собственного проекта решение состоит в том, чтобы использовать docker BuildKit, чтобы сначала собрать все рабочую область, а затем создайте образ докера для рабочей области проекта, повторно используя ранее созданные файлы.

В деталях вы скопируете в файл докеров верхний package.json с блокировкой пряжи, а затем выберите package.json нужной рабочей области. Затем запускаем установку пряжи и сборку пряжи, чтобы все заработало.

Вот мой проект:

# base image
FROM @myscope/base:latest as base

# set working directory
WORKDIR /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH

# install and cache app dependencies
COPY ["package.json","yarn.lock", "./"]
COPY ./packages/server/package.json ./packages/server/
COPY ./packages/shared/package.json ./packages/shared/
COPY ./packages/app/package.json ./packages/app/

RUN yarn install --frozen-lockfile --non-interactive --production=false --ignore-scripts
COPY . /app
RUN yarn build



FROM nodejs:14.15 as serverapp

WORKDIR /app

COPY ["package.json","yarn.lock", "./"]
COPY ./packages/server/package.json ./packages/server/
COPY ./packages/shared/package.json ./packages/shared/

RUN yarn install --frozen-lockfile --non-interactive --production=true --ignore-scripts

# copy artifact build from the 'build environment'
COPY --from=base /app/packages/shared/dist /app/packages/shared/dist

COPY ["./packages/server/", "./packages/server/"]

WORKDIR /app/packages/server
VOLUME ["/app/packages/server/logs", "/app/packages/server/uploads"]
EXPOSE $PORT
CMD ["yarn", "start"]

shared - это личное рабочее пространство, которое зависит от server рабочего пространства.

person Mathieu Seiler    schedule 29.11.2020
comment
Это отлично работает для небольших рабочих пространств, но плохо масштабируется, так как вам нужно будет перестроить докер верхнего уровня для всех изменений. Это становится дорого, если у вас есть десятки пакетов и проектов. - person Gudlaugur Egilsson; 30.11.2020

Поскольку отсутствие ответа меня не удовлетворило, я создал пакет npm, который генерирует Dockerfile для проектов lerna. Он использует стадию Docker и создает стадии для каждого пакета.

Вам просто понадобится как минимум два Dockerfile:

Базовый файл Dockerfile, содержащий глобальную настройку

Dockerfile.base:

FROM node:14 as base
COPY ./package.json ./
RUN npm i
COPY ./lerna.json ./

и шаблон для пакетов

Dockerfile.template:

FROM base as build
COPY ./package.json ./
RUN npm install
RUN --if-exists npm run build

вы также можете иметь собственные файлы Dockerfile для пакетов, просто добавив свой собственный файл Dockerfile внутри пакета. Это заменит шаблон настраиваемым файлом Dockerfile.

после этого вы можете запустить команду через npx, чтобы сгенерировать файл докеров:

npx lerna-dockerize
person Michael R.    schedule 23.04.2021