Create comprehensive Docker Compose setups for local development environments.
You are a Docker Compose expert. Help me set up a development environment.
## Project Stack
Application: ${{APPLICATION}}
Database: ${{DATABASE}}
Cache: ${{CACHE}}
Other services: ${{SERVICES}}
## Please Create:
1. **Complete Docker Compose**
```yaml
# docker-compose.yml
version: '3.9'
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
- DATABASE_URL=postgres://postgres:postgres@db:5432/myapp
- REDIS_URL=redis://redis:6379
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
command: npm run dev
db:
image: postgres:15-alpine
ports:
- "5432:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: myapp
volumes:
- postgres_data:/var/lib/postgresql/data
- ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init.sql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
mailhog:
image: mailhog/mailhog
ports:
- "1025:1025"
- "8025:8025"
minio:
image: minio/minio
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
command: server /data --console-address ":9001"
volumes:
- minio_data:/data
volumes:
postgres_data:
redis_data:
minio_data:
```
2. **Development Dockerfile**
```dockerfile
# Dockerfile.dev
FROM node:20-alpine
WORKDIR /app
# Install dependencies for hot reload
RUN apk add --no-cache git
# Copy package files
COPY package*.json ./
# Install all dependencies including devDependencies
RUN npm install
# Don't copy source - it's mounted as volume
# COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]
```
3. **Production Override**
```yaml
# docker-compose.prod.yml
version: '3.9'
services:
app:
build:
context: .
dockerfile: Dockerfile
environment:
- NODE_ENV=production
restart: always
deploy:
replicas: 2
resources:
limits:
cpus: '0.5'
memory: 512M
db:
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
secrets:
db_password:
file: ./secrets/db_password.txt
```
4. **Environment Variables**
```env
# .env.example
NODE_ENV=development
DATABASE_URL=postgres://postgres:postgres@db:5432/myapp
REDIS_URL=redis://redis:6379
JWT_SECRET=your-secret-here
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
```
5. **Helper Scripts**
```bash
#!/bin/bash
# scripts/dev.sh
# Start development environment
docker-compose up -d
# Run migrations
docker-compose exec app npm run migrate
# Seed database
docker-compose exec app npm run seed
# Tail logs
docker-compose logs -f app
```
6. **Database Tools**
```yaml
# Add pgAdmin for database management
pgadmin:
image: dpage/pgadmin4
ports:
- "5050:80"
environment:
PGADMIN_DEFAULT_EMAIL: admin@admin.com
PGADMIN_DEFAULT_PASSWORD: admin
depends_on:
- db
```
7. **Testing Services**
```yaml
# docker-compose.test.yml
version: '3.9'
services:
test:
build:
context: .
dockerfile: Dockerfile.dev
environment:
- NODE_ENV=test
- DATABASE_URL=postgres://postgres:postgres@db-test:5432/test
depends_on:
db-test:
condition: service_healthy
command: npm run test
db-test:
image: postgres:15-alpine
environment:
POSTGRES_DB: test
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
```
8. **Makefile Commands**
```makefile
.PHONY: up down logs shell db-shell test
up:
docker-compose up -d
down:
docker-compose down
logs:
docker-compose logs -f
shell:
docker-compose exec app sh
db-shell:
docker-compose exec db psql -U postgres -d myapp
test:
docker-compose -f docker-compose.test.yml run --rm test
clean:
docker-compose down -v --rmi local
```Or press ⌘C to copy
Replace these placeholders with your own content before using the prompt.
[{APPLICATION][{DATABASE][{CACHE][{SERVICES]