From aaf3f740310a1d41492de19f85e91ebe5f1b52c1 Mon Sep 17 00:00:00 2001
From: Ryan Williams <ryan.williams@signalwire.com>
Date: Sat, 6 Jan 2024 13:26:09 -0800
Subject: [PATCH] Build with Docker (#11)

* Build with Docker

* docker ci

* docker ci

* match ports

* remove comments
---
 .github/workflows/docker.yml | 45 ++++++++++++++++++++++++++++++++++++
 Dockerfile                   | 26 +++++++++++++++++++++
 compose.yaml                 |  8 +++++++
 3 files changed, 79 insertions(+)
 create mode 100644 .github/workflows/docker.yml
 create mode 100644 Dockerfile
 create mode 100644 compose.yaml

diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
new file mode 100644
index 0000000..4638716
--- /dev/null
+++ b/.github/workflows/docker.yml
@@ -0,0 +1,45 @@
+name: Docker
+
+on:
+  push:
+    branches: [ main ]
+  pull_request:
+    branches: [ main ]
+
+env:
+  TEST_TAG: call-fabric-client-beta
+
+jobs:
+  build-and-test-image:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+
+      - name: Set up QEMU
+        uses: docker/setup-qemu-action@v3
+
+      - name: Set up Docker Buildx
+        uses: docker/setup-buildx-action@v3
+
+      - name: Build and push
+        uses: docker/build-push-action@v5
+        with:
+          push: false
+          load: true
+          tags: ${{ env.TEST_TAG }}
+          cache-from: type=gha
+          cache-to: type=gha,mode=max
+
+      - name: Inspect
+        run: |
+          docker image inspect ${{ env.TEST_TAG }}
+
+      - name: Start
+        run: |
+          docker run -d --rm --name=call-fabric-client-beta ${{ env.TEST_TAG }}
+
+      - name: Logs
+        run: |
+          docker ps
+          docker logs call-fabric-client-beta
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..9a7fd5e
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,26 @@
+# syntax=docker/dockerfile:1
+
+ARG NODE_VERSION=20.10.0
+
+FROM node:${NODE_VERSION}-alpine
+
+ENV NODE_ENV production
+
+WORKDIR /usr/src/app
+
+# Download dependencies as a separate step to take advantage of Docker's caching.
+# Leverage a cache mount to /root/.npm to speed up subsequent builds.
+# Leverage a bind mounts to package.json and package-lock.json to avoid having to copy them into
+# into this layer.
+RUN --mount=type=bind,source=package.json,target=package.json \
+    --mount=type=bind,source=package-lock.json,target=package-lock.json \
+    --mount=type=cache,target=/root/.npm \
+    npm ci --omit=dev
+
+USER node
+
+COPY . .
+
+EXPOSE 3000
+
+CMD npm run start
diff --git a/compose.yaml b/compose.yaml
new file mode 100644
index 0000000..e7990ca
--- /dev/null
+++ b/compose.yaml
@@ -0,0 +1,8 @@
+services:
+  server:
+    build:
+      context: .
+    environment:
+      NODE_ENV: production
+    ports:
+      - 3000:3000