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