55 lines
1.9 KiB
Docker
55 lines
1.9 KiB
Docker
################## First Stage - Creating base #########################
|
|
|
|
# Created a variable to hold our node base image
|
|
ARG NODE_IMAGE=node:18.14.2-alpine
|
|
|
|
|
|
# Using the variable to create our base image
|
|
FROM $NODE_IMAGE AS base
|
|
# Running a command to install dumb-init to handle processes
|
|
RUN apk --no-cache add dumb-init
|
|
# Creating folders and changing ownerships
|
|
RUN mkdir -p /home/node/app && chown node:node /home/node/app
|
|
# Setting the working directory
|
|
WORKDIR /home/node/app
|
|
# Changing the current active user to "node"
|
|
USER node
|
|
# # Creating a new folder "tmp"
|
|
# RUN mkdir tmp
|
|
|
|
################## Second Stage - Installing dependencies ##########
|
|
# In this stage, we will start installing dependencies
|
|
FROM base AS dependencies
|
|
# We copy all package.* files to the working directory
|
|
COPY --chown=node:node ./package*.json ./
|
|
# We run NPM CI to install the exact versions of dependencies
|
|
RUN npm ci
|
|
# Lastly, we copy all the files with active user
|
|
COPY --chown=node:node . .
|
|
|
|
|
|
################## Third Stage - Building Stage #####################
|
|
# In this stage, we will start building dependencies
|
|
FROM dependencies AS build
|
|
# We run "node ace build" to build the app for production
|
|
RUN node ace build --production
|
|
|
|
|
|
################## Final Stage - Production #########################
|
|
# In this final stage, we will start running the application
|
|
FROM base AS production
|
|
# Here, we include all the required environment variables
|
|
# ENV NODE_ENV=production
|
|
# ENV PORT=$PORT
|
|
# ENV HOST=0.0.0.0
|
|
|
|
# Copy package.* to the working directory with active user
|
|
COPY --chown=node:node ./package*.json ./
|
|
# We run NPM CI to install the exact versions of production dependencies
|
|
RUN npm ci --omit=dev
|
|
# Copy files to the working directory from the build folder the user
|
|
COPY --chown=node:node --from=build /home/node/app/build .
|
|
# Expose port
|
|
EXPOSE $PORT
|
|
# Run the command to start the server using "dumb-init"
|
|
CMD [ "dumb-init", "node", "server.js" ] |