version: '3.8' services: mysql: image: mysql:8.0 container_name: mvc_mysql restart: always environment: MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql networks: - mvc_network healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_PASSWORD}"] timeout: 5s retries: 10 interval: 10s start_period: 30s migrate: image: migrate/migrate container_name: mvc_migrate depends_on: mysql: condition: service_healthy networks: - mvc_network volumes: - ./backend/database/migration:/migrations command: [ "-path", "/migrations", "-database", "mysql://root:${MYSQL_PASSWORD}@tcp(mysql:3306)/${MYSQL_DATABASE}", "up" ] restart: "on-failure" backend: build: context: ./backend dockerfile: Dockerfile container_name: mvc_backend restart: unless-stopped env_file: - ./.env environment: MYSQL_HOST: mysql ports: - "${BACKEND_PORT}:8081" depends_on: mysql: condition: service_healthy migrate: condition: service_completed_successfully networks: - mvc_network frontend: build: context: ./frontend dockerfile: Dockerfile container_name: mvc_frontend restart: unless-stopped env_file: - ./frontend/.env ports: - "5173:5173" volumes: - ./frontend:/app - /app/node_modules networks: - mvc_network depends_on: - backend networks: mvc_network: driver: bridge volumes: mysql_data: