pnpm fetch
Завантажити пакунки з файлу блокування у віртуальне сховище, маніфест пакунків ігнорується.
Сценарій використання
Ця команда спеціально розроблена для покращення створення образів docker.
Можливо, ви вже ознайомилися з офіційним посібником з написання Dockerfile для застосунків Node.js, якщо ви ще не читали його, можливо, вам варто спочатку ознайомитися з ним.
З цього посібника ми дізнаємося як писати оптимізований Dockerfile для проєктів з використанням pnpm, що виглядає так
FROM node:20
WORKDIR /path/to/somewhere
RUN corepack enable pnpm && corepack install -g pnpm@latest-10
# Файли, необхідні для pnpm install
COPY .npmrc package.json pnpm-lock.yaml pnpm-workspace.yaml .pnpmfile.cjs ./
# Якщо ви виправили якийсь пакунок, також додайте патчі перед встановленням
COPY patches patches
RUN pnpm install --frozen-lockfile --prod
# Вихідний код застосунку
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]
Поки не внесено змін до .npmrc
, package.json
, pnpm-lock.yaml
, pnpm-workspace.yaml
, .pnpmfile.cjs
, кеш збірки докера залишається чинним до рівня RUN pnpm install --frozen-lockfile --prod
, на який витрачається більша частина часу під час збирання образу докера.
Однак зміни до package.json
можуть відбуватися набагато частіше, ніж ми очікуємо, оскільки він не лише містить залежності, але також може містити номер версії, сценарії та довільні конфігурації для будь-яких інших інструментів.
Також важко підтримувати Dockerfile який будує монорепо проєкт, це може виглядати так
FROM node:20
WORKDIR /path/to/somewhere
RUN corepack enable pnpm && corepack install -g pnpm@latest-10
# Файли потрібні для pnpm install
COPY .npmrc package.json pnpm-lock.yaml pnpm-workspace.yaml .pnpmfile.cjs ./
# Якщо ви виправили якийсь пакунок, також додайте патчі перед встановленням
COPY patches patches
# для кожного вкладеного пакунку ми маємо додати один додатковий крок, щоб скопіювати його маніфест
# у потрібне місце, оскільки докер не має можливості відфільтрувати лише package.json за допомогою
# єдиної інструкції
COPY packages/foo/package.json packages/foo/
COPY packages/bar/package.json packages/bar/
RUN pnpm install --frozen-lockfile --prod
# Вихідний код застосунку
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]
Як бачите, Dockerfile потрібно оновлювати коли ви додаєте або видаляєте вкладені пакунки.
pnpm fetch
чудово розвʼязує вищезгадану проблему, надаючи можливість завантажувати пакунки до віртуального сховища, використовуючи лише інформацію з файлу блокування та конфігураційного файлу (pnpm-workspace.yaml
).
FROM node:20
WORKDIR /path/to/somewhere
RUN corepack enable pnpm && corepack install -g pnpm@latest-10
# pnpm fetch вимагає тільки lockfile
COPY pnpm-lock.yaml pnpm-workspace.yaml ./
# Якщо ви виправили будь-який пакунок, включіть виправлення перед запуском pnpm fetch
COPY patches patches
RUN pnpm fetch --prod
ADD . ./
RUN pnpm install -r --offline --prod
EXPOSE 8080
CMD [ "node", "server.js" ]
Це працює для простих проєктів і монорепозиторіїв, --offline
змусить pnpm не спілкуватись з реєстром пакунків, бо усі потрібні пакунки вже присутні в віртуальному сховищі.
Поки файл блокування не змінено, кеш збірки чинний, тому RUN pnpm install -r --offline --prod
, збереже багато часу.
Параметри
--dev, -D
Будуть завантажені лише пакунки для розробки
--prod, -P
Пакунки для розробки не будуть завантажені