Work with Multi Stage Dockerfile
backendcontains the backend source codefrontendcontains the frontend source code
| # | |
| # Multipart dockerfile for build the application and the delivery docker image | |
| # | |
| FROM node:12-alpine AS builder | |
| WORKDIR /builder | |
| RUN \ | |
| apk add --update tree openssl && \ | |
| mkdir -p /builder/frontend/src /builder/app /builder/backend/src | |
| # Copy Frontend | |
| COPY frontend/*.json /builder/frontend/ | |
| COPY frontend/src /builder/frontend/src | |
| # Copy Backend | |
| COPY backend/*.json /builder/backend/ | |
| COPY backend/src/ /builder/backend/src/ | |
| # RUN \ | |
| # tree /builder/backend | |
| # Build Frontend | |
| RUN \ | |
| cd /builder/frontend && \ | |
| npm ci && \ | |
| npm run build:prod && \ | |
| mv /builder/frontend/dist/xev /builder/app/html && \ | |
| echo "> Info: Fontend is built success... Path: \"/builder/app/html\"" | |
| # Build Backend | |
| RUN \ | |
| cd /builder/backend && \ | |
| npm ci && \ | |
| npm run build && \ | |
| mv /builder/backend/dist /builder/app/lib && \ | |
| cp /builder/backend/*.json /builder/app/ && \ | |
| mv /builder/backend/node_modules /builder/app/node_modules && \ | |
| echo "> Info: Backend is built successful.. Path: \"/builder/app\"" | |
| # Generates public / private RSA keys | |
| RUN \ | |
| mkdir /builder/app/etc && \ | |
| # generates the private key with 2048 bits | |
| openssl genrsa -out /builder/app/etc/prod-private.pem 2048 && \ | |
| # generates the public key | |
| openssl rsa -in /builder/app/etc/prod-private.pem -pubout -out /builder/app/etc/prod-public.pem && \ | |
| # View the folder content | |
| tree -I node_modules /builder/app && \ | |
| echo "Info: Build is finish... Path: \"/builder/app\"" | |
| FROM node:12-alpine AS delivery | |
| WORKDIR /app | |
| COPY docker/start.sh /app | |
| COPY --from=builder /builder/app /app | |
| RUN \ | |
| chmod +x /app/start.sh | |
| EXPOSE $PORT | |
| CMD ["/app/start.sh"] |
| #!/usr/bin/env sh | |
| # checked the required Envs | |
| if [[ -z "${PORT}" ]]; then | |
| echo "> Error: Server Port is required" | |
| exit 1 | |
| fi | |
| if [[ -z "${DB_HOST}" ]]; then | |
| echo "> Error: Database Host is required" | |
| exit 1 | |
| fi | |
| if [[ -z "${DB_PORT}" ]]; then | |
| echo "> Error: Database Port is required" | |
| exit 1 | |
| fi | |
| if [[ -z "${DB_USER}" ]]; then | |
| echo "> Error: Database User is required" | |
| exit 1 | |
| fi | |
| if [[ -z "${DB_PASSWORD}" ]]; then | |
| echo "> Error: Database User Password is required" | |
| exit 1 | |
| fi | |
| if [[ -z "${DB_DATABASE}" ]]; then | |
| echo "> Error: Database Name is required" | |
| exit 1 | |
| fi | |
| if [[ -z "${DIGEST_SECRET}" ]]; then | |
| echo "> Error: Digest Secrets is required" | |
| exit 1 | |
| fi | |
| export AUTH_PRIVATE_URL=/app/etc/prod-private.pem | |
| export AUTH_PUBLIC_URL=/app/etc/prod-public.pem | |
| # | |
| # application stage is always "prod" in the AWS environment | |
| # | |
| export APP_STAGE=prod | |
| # Change working directory | |
| cd /app | |
| # Node | |
| node lib/main.js |