@uscreen.de/nxprune

0.3.0 • Public • Published

nxprune - like turbo prune --docker for nx.js

pre-alpha: supports yarn workspaces with plain nx tasks only. Tested on a few private monorepos only.

Example Dockerfile

Uses multi-stage setup to build a production docker image with the following steps:

  1. prune
  2. install dev (needed for build)
  3. install prod
  4. build
  5. combine prod & build for production

nxprune installs globally within docker container to prune one service or package from your workspace. The Dockerfile requires two env variables so it can be used as one template for all services within a workspace.

FROM node:16-bullseye-slim AS base
WORKDIR /app

# prune (aka isolate) scope from all packages in monorepo
FROM base AS pruner
COPY . .
RUN yarn global add @uscreen.de/nxprune
RUN nxprune --scope=${SCOPE}

# install dev deps
FROM base AS dev-deps
COPY --from=pruner /app/out/json/ .
COPY --from=pruner /app/out/yarn.lock ./yarn.lock
RUN yarn install --frozen-lockfile

# install prod deps
FROM base AS prod-deps
COPY --from=pruner /app/out/json/ .
COPY --from=pruner /app/out/yarn.lock ./yarn.lock
RUN yarn install --frozen-lockfile --production --prefer-offline --ignore-scripts

# run a build with dev deps for pruned scope
FROM base AS builder
COPY --from=dev-deps /app/ .
COPY --from=pruner /app/out/full/ .
RUN yarn nx run ${SCOPE}:build
RUN find . -name node_modules | xargs rm -rf
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -qq install dumb-init

# copy to tiny production image
FROM gcr.io/distroless/nodejs-debian11:16
COPY --from=builder /usr/bin/dumb-init /usr/bin/dumb-init
WORKDIR /app
USER nonroot
COPY --chown=nonroot:nonroot --from=prod-deps /app/ .
COPY --chown=nonroot:nonroot --from=builder /app/ .
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["/nodejs/bin/node", "--unhandled-rejections=strict", "${APP}"]

Build a docker image

plain sh like command to build a service image, i.e.:

SCOPE=@myrepo/myservice APP=apps/myservice/index.js envsubst < ./Dockerfile | docker build . -f- -t myrrepo-myservice:latest --secret id=npmrc,src=.npmrc

This is to be run from root of the monorepo with a directory layout like so:

├── Dockerfile
├── node_modules
├── nx.json
├── package.json
├── apps
│   ├── myservice
│   │   ├── index.js
│   │   └── package.json
│   └── yourservice
└── yarn.lock

License

Licensed under MIT.

Published, Supported and Sponsored by u|screen

Readme

Keywords

none

Package Sidebar

Install

npm i @uscreen.de/nxprune

Weekly Downloads

0

Version

0.3.0

License

MIT

Unpacked Size

5.24 kB

Total Files

7

Last publish

Collaborators

  • msuscreen
  • uscreen
  • mashpie
  • mherting
  • maxschmidt
  • csarin
  • huckels