Deploy with Docker
Package your Stoma gateway as a Docker container for deployment to Kubernetes, ECS, or any container platform.
Quick Start
Section titled “Quick Start”-
Create Dockerfile
Dockerfile FROM node:22-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ciCOPY src ./srcRUN npm run buildFROM node:22-alpine AS runnerWORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=builder /app/node_modules ./node_modulesCOPY --from=builder /app/package.json ./EXPOSE 3000CMD ["node", "dist/server.js"] -
Build and run
Terminal window docker build -t stoma-gateway .docker run -p 3000:3000 stoma-gateway
Alpine-Based Image
Section titled “Alpine-Based Image”For minimal image size (~55MB):
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./RUN npm ci
COPY src ./srcRUN npm run build
FROM node:22-alpine
WORKDIR /app
RUN addgroup -g 1001 -S nodejs && \ adduser -S stoma -u 1001
COPY --chown=stoma:nodejs --from=builder /app/dist ./distCOPY --chown=stoma:nodejs --from=builder /app/node_modules ./node_modulesCOPY --chown=stoma:nodejs --from=builder /app/package.json ./
USER stoma
EXPOSE 3000ENV NODE_ENV=production
CMD ["node", "dist/server.js"]Build and run:
docker build -t stoma-gateway:alpine .docker run -p 3000:3000 stoma-gateway:alpineMulti-Stage Build
Section titled “Multi-Stage Build”Best for production with separate build and runtime stages:
# Stage 1: DependenciesFROM node:22-alpine AS deps
WORKDIR /appCOPY package*.json ./RUN npm ci --omit=dev
# Stage 2: BuilderFROM node:22-alpine AS builder
WORKDIR /appCOPY --from=deps /app/node_modules ./node_modulesCOPY . .RUN npm run build
# Stage 3: RunnerFROM node:22-alpine AS runner
WORKDIR /app
RUN addgroup -g 1001 -S stoma && \ adduser -S stoma -u 1001
COPY --from=builder --chown=stoma:stoma /app/dist ./distCOPY --from=builder --chown=stoma:stoma /app/node_modules ./node_modulesCOPY --from=builder --chown=stoma:stoma /app/package.json ./
USER stoma
EXPOSE 3000ENV NODE_ENV=production PORT=3000
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
CMD ["node", "dist/server.js"]Distroless Images
Section titled “Distroless Images”For maximum security (no shell or package manager):
FROM node:22-alpine AS builder
WORKDIR /appCOPY package*.json ./RUN npm ci
COPY src ./srcRUN npm run build
# Copy build artifacts to distroless baseFROM gcr.io/distroless/nodejs:22
WORKDIR /app
COPY --from=builder /app/dist ./distCOPY --from=builder /app/node_modules ./node_modulesCOPY --from=builder /app/package.json ./
EXPOSE 3000ENV NODE_ENV=production
CMD ["dist/server.js"]Image Size Comparison
Section titled “Image Size Comparison”| Base Image | Size | Use Case |
|---|---|---|
node:22 | ~1GB | Development only |
node:22-alpine | ~55MB | Production |
gcr.io/distroless/nodejs:22 | ~100MB | Production (smallest) |
node:22-slim | ~300MB | Production (debugging) |
Related Guides
Section titled “Related Guides” Docker Compose Local development with Docker Compose
Kubernetes Deploy to Kubernetes