Робота з Docker
Неможливо створити reflinks або hardlinks між контейнером Docker і головною файловою системою під час збирання. Наступне найкраще, що ви можете зробити, це використовувати монтування кешу BuildKit для спільного використання кешу між збірками. Alternatively, you may use podman because it can mount Btrfs volumes during build time.
Мінімізація розміру образу Docker і часу збірки
- Use a small image, e.g.
node:XX-slim
. - Використовуйте багатоетапну збірку, якщо це можливо і має сенс.
- Використовуйте монтування кешу BuildKit.
Приклад 1: Створення пакета в контейнері Docker
Since devDependencies
is only necessary for building the bundle, pnpm install --prod
will be a separate stage
from pnpm install
and pnpm run build
, allowing the final stage to copy only necessary files from the earlier
stages, minimizing the size of the final image.
node_modules
.git
.gitignore
*.md
dist
FROM node:20-slim AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable
COPY . /app
WORKDIR /app
FROM base AS prod-deps
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile
FROM base AS build
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile
RUN pnpm run build
FROM base
COPY --from=prod-deps /app/node_modules /app/node_modules
COPY --from=build /app/dist /app/dist
EXPOSE 8000
CMD [ "pnpm", "start" ]
Приклад 2: Створення кількох образів Docker у монорепо
Припустимо, у вас є монорепо з 3 пакунками: app1, app2 та common; app1 та app2 залежать від common, але не один від одного.
You want to save only necessary dependencies for each package, pnpm deploy
should help you with copying only necessary files and packages.
./
├── Dockerfile
├── .dockerignore
├── .gitignore
├── packages/
│ ├── app1/
│ │ ├── dist/
│ │ ├── package.json
│ │ ├── src/
│ │ └── tsconfig.json
│ ├── app2/
│ │ ├── dist/
│ │ ├── package.json
│ │ ├── src/
│ │ └── tsconfig.json
│ └── common/
│ ├── dist/
│ ├── package.json
│ ├── src/
│ └── tsconfig.json
├── pnpm-lock.yaml
├── pnpm-workspace.yaml
└── tsconfig.json
packages:
- 'packages/*'
node_modules
.git
.gitignore
*.md
dist