pnpm fetch
Отримати пакети з файлу блокування в віртуальному сховищі, маніфест пакета ігнорується.
Сценарій використання
Ця команда спеціально розроблена для покращення створення образу докера.
You may have read the official guide to writing a Dockerfile for a Node.js app, if you haven't read it yet, you may want to read it first.
З цього посібника ми дізнаємося як писати оптимізований Dockerfile для проєктів з використанням pnpm, що виглядає так
FROM node:14
WORKDIR /path/to/somewhere
RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
# Файли, необхідні для pnpm install
COPY .npmrc package.json pnpm-lock.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
, .pnpmfile.cjs
, кеш збірки docker буде чинним до рівня RUN pnpm install --frozen-lockfile --prod
, який витрачає більшу частину часу під час створення образу docker.
Однак зміни до package.json
можуть відбуватися набагато частіше, ніж ми очікуємо, оскільки він не лише містить залежності, але також може містити номер версі ї, сценарії та довільні конфігурації для будь-яких інших інструментів.
Також важко підтримувати Dockerfile який будує monorepo проєкт, це може виглядати
FROM node:14
WORKDIR /path/to/somewhere
RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
# Файли, необхідні для pnpm install
COPY .npmrc package.json pnpm-lock.yaml .pnpmfile.cjs ./
# Якщо ви пропатчили якийсь пакунок, включіть патчі перед встановленням
COPY patches patches
# для кожного підпакета, ми повинні додати додатковий крок щоб копіювати їх маніфести
# в правильне місце, бо docker не має можливості фільтрувати кожен 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" ]
As you can see, the Dockerfile has to be updated when you add or remove sub-packages.
pnpm fetch
solves the above problem perfectly by providing the ability to load packages into the virtual store using only information from a lockfile.
FROM node:14
WORKDIR /path/to/somewhere
RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
# pnpm fetch does require only lockfile
COPY pnpm-lock.yaml ./
# If you patched any package, include patches before running pnpm fetch
COPY patches patches
RUN pnpm fetch --prod
ADD . ./
RUN pnpm install -r --offline --prod
EXPOSE 8080
CMD [ "node", "server.js" ]
It works for both simple and monorepo projects, --offline
enforces pnpm not to communicate with the package registry as all needed packages are already present in the virtual store.
As long as the lockfile is not changed, the build cache is valid up to the layer, so RUN pnpm install -r --offline --prod
, will save you much time.
Options
--dev, -D
Only development packages will be fetched
--prod, -P
Development packages will not be fetched