docker-compose with PostgreSQL and Redis

The Whole Stack Locally

docker-compose.yml

services:
  api:
    build: .
    ports: ["3000:3000"]
    env_file: .env.docker
    depends_on:
      db: { condition: service_healthy }
      redis: { condition: service_started }
    command: sh -c "npx prisma migrate deploy && node dist/main.js"

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: shopease
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: shopease
    volumes: ["pgdata:/var/lib/postgresql/data"]
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U shopease"]
      interval: 5s
      retries: 10

  redis:
    image: redis:7-alpine

volumes:
  pgdata:

Example

docker compose up -d --build
docker compose ps

Example output

[+] Running 4/4
 ✔ Network shopease_default    Created
 ✔ Container shopease-db-1     Healthy
 ✔ Container shopease-redis-1  Started
 ✔ Container shopease-api-1    Started
NAME               IMAGE          STATUS                   PORTS
shopease-api-1     shopease-api   Up 8 seconds (healthy)   0.0.0.0:3000->3000/tcp
shopease-db-1      postgres:16    Up 15 seconds (healthy)  5432/tcp
shopease-redis-1   redis:7-alpine Up 15 seconds            6379/tcp

Note: Inside compose, services reach each other by name: DATABASE_URL=postgresql://shopease:secret@db:5432/shopease, REDIS_URL=redis://redis:6379.