version: '3.8' # Development Environment Docker Compose # Usage: docker-compose -f template/docker-compose.dev.yml up --build services: # Application Service (Matching App) app: # Build from the Dockerfile in the project root build: context: .. # Context is the parent directory where Dockerfile resides dockerfile: Dockerfile # Explicitly specify the Dockerfile name # You could target a specific 'dev' stage here if you create one in Dockerfile for hot-reloading # target: development container_name: matching_app_dev # Mount the source code for local development # Changes in your local code will reflect inside the container volumes: - ..:/app # Use a named volume for Go modules cache to speed up builds - go_modules:/go/pkg/mod # Environment variables from .env file (create .env in project root) env_file: - ../.env # Assumes .env file is in the project root (one level up) ports: # Map local port 8080 to container port 8080 (adjust if your app uses a different port) - "8080:8080" depends_on: db: # Ensure the database is ready before starting the app condition: service_healthy # Command to run the application (consider using a tool like Air for live reloading) # Sử dụng go run cho phát triển: command: go run ./cmd/server/main.go # Example using the built binary (if build stage creates it): # command: /app/matching-app restart: unless-stopped # Database Service (PostgreSQL) db: image: postgres:15-alpine # Using alpine variant for smaller size container_name: matching_db_dev environment: # Read DB credentials directly from .env file POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: matching_app volumes: # Persist database data using a named volume - db_data_dev:/var/lib/postgresql/data # Mount local migrations to initialize DB on first run - ../migrations:/docker-entrypoint-initdb.d ports: # Map local port 5433 to container port 5432 to avoid conflict with local postgres - "5433:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"] interval: 5s timeout: 5s retries: 5 restart: unless-stopped # Resource limits suitable for development deploy: resources: limits: cpus: '0.5' memory: 512M # Database Admin Tool (Adminer) adminer: image: adminer container_name: matching_adminer_dev ports: - "8081:8080" # Map local port 8081 to container port 8080 depends_on: - db restart: always volumes: db_data_dev: # Named volume for development DB data go_modules: # Named volume for Go modules cache