|
1 | 1 | # Define the base image used for the rest of the steps |
2 | | -FROM node:22-alpine AS base |
| 2 | +FROM node:24.13.0-alpine AS base |
| 3 | +# Install Corepack to manage the package manager version. The --force |
| 4 | +# flag is required to allow overriding pre-existing npm and yarn binaries. |
| 5 | +RUN npm install --global --force corepack |
3 | 6 | RUN apk add --no-cache tini |
4 | 7 | ENTRYPOINT ["/sbin/tini", "--"] |
5 | 8 | RUN mkdir /app && chown node:node app |
6 | | -# Run as uid=1000(node) |
| 9 | +# Run as uid=1000(node) - The user needs to be numeric so that Kubernetes |
| 10 | +# can verify user is non-root when securityContext.runAsNonRoot is true. |
7 | 11 | USER 1000 |
8 | 12 | WORKDIR /app |
| 13 | +# Ensure that the correct version of pnpm is installed |
| 14 | +COPY --chown=node:node package.json ./ |
| 15 | +RUN corepack install \ |
| 16 | + && rm package.json |
9 | 17 |
|
10 | | -# Visual Studio Code workspace tools |
| 18 | +# Visual Studio Code workspace tools & dependencies |
11 | 19 | FROM base AS workspace |
12 | 20 | USER root |
13 | 21 | RUN apk add --no-cache \ |
| 22 | + bash \ |
14 | 23 | curl \ |
15 | 24 | git \ |
16 | 25 | httpie \ |
17 | 26 | openssh \ |
18 | 27 | ripgrep |
19 | 28 | # Run as uid=1000(node) |
20 | 29 | USER 1000 |
| 30 | +# Allow npm and pnpm to install packages with --global without sudo. |
| 31 | +RUN mkdir ~/.npm-global \ |
| 32 | + && mkdir -p ~/.pnpm-global/bin \ |
| 33 | + && npm config set -L user prefix ~/.npm-global \ |
| 34 | + && pnpm config set -g global-bin-dir ~/.pnpm-global/bin |
21 | 35 | ENV NODE_ENV=development |
| 36 | +ENV PATH="$PATH:/home/node/.local/bin:/home/node/.npm-global/bin:/home/node/.pnpm-global/bin" |
| 37 | +# Create directories before (anonymous or named) volumes are be mounted |
| 38 | +# to them, so that the ownership will be correct. |
| 39 | +RUN mkdir ~/.vscode-server |
22 | 40 |
|
23 | | -# Collect development dependencies |
24 | | -FROM base AS dev |
25 | | -COPY --chown=node:node .npmrc package.json package-lock.json /app/ |
26 | | -RUN npm ci --no-audit --no-fund |
| 41 | +FROM base AS dev-deps |
| 42 | +COPY --chown=node:node package.json pnpm-workspace.yaml pnpm-lock.yaml ./ |
| 43 | +RUN pnpm i --frozen-lockfile |
27 | 44 |
|
28 | | -# Collect production dependencies |
29 | | -FROM dev AS prod |
30 | | -RUN npm ci --omit=dev --no-audit --no-fund |
| 45 | +FROM dev-deps AS prod-deps |
| 46 | +RUN pnpm i --prod --frozen-lockfile |
31 | 47 |
|
32 | | -# Build the production code |
33 | | -FROM dev AS build |
34 | | -COPY --chown=node:node . /app |
35 | | -RUN npm run build |
| 48 | +FROM dev-deps AS build |
| 49 | +COPY --chown=node:node . . |
| 50 | +RUN pnpm build |
36 | 51 |
|
37 | 52 | # Final image, collect the production code & dependencies |
38 | 53 | FROM base |
39 | | -COPY --from=prod --chown=node:node /app/node_modules /app/node_modules |
40 | | -COPY --from=build --chown=node:node /app/dist /app/dist |
| 54 | +COPY --chown=node:node package.json pnpm-workspace.yaml ./ |
| 55 | +COPY --chown=node:node --from=prod-deps /app/node_modules ./node_modules |
| 56 | +COPY --chown=node:node --from=build /app/dist ./dist |
41 | 57 | ENV NODE_ENV=production |
42 | | -CMD ["node", "--enable-source-maps", "dist/index.js"] |
| 58 | +CMD ["node", "--run", "start"] |
0 commit comments