Skip to content
Snippets Groups Projects
Dockerfile 1.50 KiB
ARG NODEJS_VERSION='16.17.0'

# ------------------------------------------------------------------
# Base container to be used in the next stages

FROM node:$NODEJS_VERSION-alpine AS base

ARG \
    MONGODB_URL_TEST=mongodb://host.docker.internal:27017/todo-app \
    JWT_SECRET_TEST=<my-very-secret-jwt>

ENV \
    PORT=<dynamically-set-from-k8s> \
    MONGODB_URL=<dynamically-set-from-k8s> \
    JWT_SECRET=<dynamically-set-from-k8s>

# ------------------------------------------------------------------
# Test stage
FROM base AS test

# client tests
WORKDIR /client

COPY ./client .

RUN npm ci --no-audit --no-fund

RUN npm run test

# server tests
WORKDIR /server

COPY ./server/src ./src/

COPY ./server/package*.json .

RUN npm ci --no-audit --no-fund

ARG \
    MONGODB_URL_TEST \
    JWT_SECRET_TEST

# MONGODB_URL and JWT_SECRET are available as env variables
RUN MONGODB_URL=$MONGODB_URL_TEST JWT_SECRET=$JWT_SECRET_TEST npm run test

# ------------------------------------------------------------------
# Build stage
FROM base AS build

ARG APP_BUILD_PATH=/build

# server build
WORKDIR $APP_BUILD_PATH

COPY ./server/src .

COPY ./server/package*.json .

RUN \
    npm ci --prod --no-audit --no-fund \
    && rm -rf ./package*

# client build
WORKDIR /client

COPY ./client .

RUN \
    npm i --no-audit --no-fund \
    && \
    BUILD_PATH=..$APP_BUILD_PATH/public \
    npm run build

WORKDIR $APP_BUILD_PATH

# MONGODB_URL and JWT_SECRET should be available as env variables
CMD ["node", "./index.js"]

EXPOSE $PORT