Dockerise a Waku app

How to package a Waku app into a Docker container.


Dockerise a Waku app

Bundle your Waku app into a Docker container for portability and easy deployment in various environments.

Prerequisites

Make sure you have Docker and Node.js installed on your machine. We will prepare the image and container in 3 easy steps for reproducible results. Create 3 files in your folder root: Dockerfile, .dockerignore, docker-compose.yml.

Dockerfile

First, let's take a look at Dockerfile where we define the Docker commands to build the app image.

FROM node:20-alpine as builder

WORKDIR /app

# import dependencies
COPY package.json .
COPY package-lock.json .

RUN npm install

# copy assets
COPY . .

RUN npm run build

EXPOSE 8080

CMD ["npm", "run", "start"]

Dockerfile is set up so that it uses Docker's multi-stage build paradigm, in which different layers of the process are cached and reused on subsequent builds if the underlying files have not changed since the previous build. Here's a breakdown of the commands:

  1. FROM: use a Node v20 base image to scaffold the build process
  2. WORKDIR: set a directory path where all the following commands take place
  3. COPY: copy dependency info to the working directory (signified by the dot at the end)
  4. RUN: install project dependencies
  5. COPY: copy project assets (images, jsx files etc.)
  6. RUN: build the app with production settings
  7. EXPOSE: declare a port to enable access to the application from the container
  8. CMD: start up the app

A health check command can be optionally included at the end of the Dockerfile. An example would be: HEALTHCHECK --interval=30s CMD wget -qO- http://localhost:8080 || exit 1

.dockerignore file

Use an ignore file to avoid copying unnecessary/undesirable files into the image. For example:

/node_modules
.vscode

This way node_modules files will not be copied in the above Dockerfile setup.

docker-compose.yml file

To streamline the build process, create a compose file which will be easily extensible when additional services are needed:

version: '3.8'

services:
  waku-app-frontend:
    build:
      context: .
    image: wakuapp
    environment:
      NODE_ENV: production
    ports:
      - 8080:8080

Specify the name of the service, and within it add the following:

  • build context ( cwd ) where the build process should take place
  • image name so that the correct image is used to create the container
  • environment variables
  • port forwarding so the app is accessible on the host machine (e.g. in your browser)

Build the container

Finally, with the blueprints ready, build the container using the following command: docker-compose up -d --build

With this, the app should be accessible from localhost in the browser and the container should be deployable to cloud hosting platforms.

designed bycandycode alternative graphic design web development agency San Diego