Skip to content

Docker Deployment

Deploy USL applications with Docker.

Generated Dockerfile

USL generates an optimized Dockerfile:

FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package*.json ./

EXPOSE 3000
CMD ["node", "dist/main.js"]

Build Image

docker build -t my-app:latest .

Run Container

docker run -d \
  -p 3000:3000 \
  -e DATABASE_URL=postgresql://db/mydb \
  -e NODE_ENV=production \
  --name my-app \
  my-app:latest

Docker Compose

docker-compose.yml:

version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgresql://db:5432/mydb
      NODE_ENV: production
    depends_on:
      - db

  db:
    image: postgres:15
    environment:
      POSTGRES_DB: mydb
      POSTGRES_PASSWORD: secret
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

Run with:

docker-compose up -d

Multi-stage Builds

For production optimization:

# Build stage
FROM node:18-alpine AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build

# Production stage
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nodejs -u 1001
USER nodejs
EXPOSE 3000
CMD ["node", "dist/main.js"]

Registry

Push to Docker Hub:

docker tag my-app:latest username/my-app:latest
docker push username/my-app:latest

Or private registry:

docker tag my-app:latest registry.example.com/my-app:latest
docker push registry.example.com/my-app:latest

Back to Deployment Overview