Last active 2 years ago

nestjs.Dockerfile Raw
1###############################
2# BUILD FOR LOCAL DEVELOPMENT #
3###############################
4
5FROM node:18-alpine As development
6
7# Create app directory
8WORKDIR /usr/src/app
9
10# Copy application dependency manifests to the container image.
11# A wildcard is used to ensure copying both package.json AND package-lock.json (when available).
12# Copying this first prevents re-running npm install on every code change.
13COPY --chown=node:node package*.json ./
14
15# Install app dependencies using the `npm ci` command instead of `npm install`
16RUN npm ci
17
18# Bundle app source
19COPY --chown=node:node . .
20
21# Use the node user from the image (instead of the root user)
22USER node
23
24########################
25# BUILD FOR PRODUCTION #
26########################
27
28FROM node:18-alpine As build
29
30WORKDIR /usr/src/app
31
32COPY --chown=node:node package*.json ./
33
34# In the previous development stage we ran `npm ci` which installed all dependencies
35# so we can copy over the node_modules directory from the development image
36COPY --chown=node:node --from=development /usr/src/app/node_modules ./node_modules
37
38COPY --chown=node:node . .
39
40# Run the build command which creates the production bundle
41RUN npm run build
42
43# Set NODE_ENV environment variable
44ENV NODE_ENV production
45
46# Passing in --omit=dev ensures that only the production dependencies are installed.
47RUN npm ci --omit=dev && npm cache clean --force
48
49USER node
50
51##############
52# PRODUCTION #
53##############
54
55FROM node:18-alpine As production
56
57# Copy the bundled code from the build stage to the production image
58COPY --chown=node:node --from=build /usr/src/app/node_modules ./node_modules
59COPY --chown=node:node --from=build /usr/src/app/dist ./dist
60
61# Start the server using the production build
62CMD [ "node", "dist/main.js" ]
63
nextjs.Dockerfile Raw
1################
2# DEPENDENCIES #
3################
4FROM node:18-alpine AS deps
5RUN apk add --no-cache libc6-compat
6USER node
7WORKDIR /app
8COPY --chown=node:node package*.json ./
9RUN npm ci
10
11###########
12# BUILDER #
13###########
14FROM node:18-alpine AS builder
15
16USER node
17WORKDIR /app
18
19COPY --chown=node:node --from=deps /app/node_modules ./node_modules
20COPY --chown=node:node . .
21
22ENV NODE_ENV production
23ENV NEXT_PUBLIC_URL APP_NEXT_PUBLIC_URL
24ENV NEXT_PUBLIC_UPLOADS_URL APP_NEXT_PUBLIC_UPLOADS_URL
25RUN npm run build
26
27RUN npm ci --omit=dev && npm cache clean --force
28
29##############
30# PRODUCTION #
31##############
32FROM node:18-alpine AS runner
33
34USER node
35WORKDIR /app
36
37ENV NODE_ENV production
38
39COPY --chown=node:node --from=builder /app/node_modules ./node_modules
40COPY --chown=node:node --from=builder /app/package*.json ./
41COPY --chown=node:node --from=builder /app/entrypoint.sh ./
42
43COPY --chown=node:node --from=builder /app/next.config.js ./
44COPY --chown=node:node --from=builder /app/public ./public
45COPY --chown=node:node --from=builder /app/.next ./.next
46
47EXPOSE 3000
48
49ENTRYPOINT ["/app/entrypoint.sh"]
50CMD ["node_modules/.bin/next", "start"]
51
52######################
53# /app/entrypoint.sh #
54######################
55
56#!/bin/sh
57set -Ex
58
59function apply_path {
60 test -n "$NEXT_PUBLIC_URL"
61 test -n "$NEXT_PUBLIC_UPLOADS_URL"
62
63 find /app/.next \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i "s#APP_NEXT_PUBLIC_URL#$NEXT_PUBLIC_URL#g"
64 find /app/.next \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i "s#APP_NEXT_PUBLIC_UPLOADS_URL#$NEXT_PUBLIC_UPLOADS_URL#g"
65}
66
67apply_path
68exec "$@"
69