#!/bin/bash # Script de build et lancement Docker pour l'interface de classification de déchets # Usage: ./run_docker.sh [build|start|stop|restart|logs|clean] set -e # Arrêter en cas d'erreur # Configuration CONTAINER_NAME="waste-classifier-app" IMAGE_NAME="waste-classifier" PORT=8501 # Couleurs pour les messages RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Fonctions utilitaires log_info() { echo -e "${BLUE}ℹ️ $1${NC}" } log_success() { echo -e "${GREEN}✅ $1${NC}" } log_warning() { echo -e "${YELLOW}⚠️ $1${NC}" } log_error() { echo -e "${RED}❌ $1${NC}" } # Vérifier que Docker est installé check_docker() { if ! command -v docker &> /dev/null; then log_error "Docker n'est pas installé. Veuillez l'installer d'abord." exit 1 fi if ! command -v docker-compose &> /dev/null; then log_error "Docker Compose n'est pas installé. Veuillez l'installer d'abord." exit 1 fi } # Build de l'image Docker build_image() { log_info "Construction de l'image Docker..." # Vérifier que les fichiers nécessaires existent if [ ! -f "app.py" ]; then log_error "Fichier app.py non trouvé" exit 1 fi if [ ! -f "requirements.txt" ]; then log_error "Fichier requirements.txt non trouvé" exit 1 fi # Build avec docker-compose docker-compose build --no-cache log_success "Image Docker construite avec succès" } # Démarrer le conteneur start_container() { log_info "Démarrage du conteneur..." # Vérifier si le conteneur est déjà en cours d'exécution if docker ps -q -f name=$CONTAINER_NAME | grep -q .; then log_warning "Le conteneur est déjà en cours d'exécution" return 0 fi # Démarrer avec docker-compose docker-compose up -d # Attendre que le conteneur soit prêt log_info "Attente du démarrage du conteneur..." sleep 10 # Vérifier la santé du conteneur if docker ps -q -f name=$CONTAINER_NAME | grep -q .; then log_success "Conteneur démarré avec succès" log_info "Interface disponible sur: http://localhost:$PORT" else log_error "Échec du démarrage du conteneur" exit 1 fi } # Arrêter le conteneur stop_container() { log_info "Arrêt du conteneur..." docker-compose down log_success "Conteneur arrêté" } # Redémarrer le conteneur restart_container() { log_info "Redémarrage du conteneur..." stop_container start_container } # Afficher les logs show_logs() { log_info "Affichage des logs..." docker-compose logs -f } # Nettoyer les ressources Docker clean_docker() { log_info "Nettoyage des ressources Docker..." # Arrêter et supprimer le conteneur docker-compose down # Supprimer l'image if docker images -q $IMAGE_NAME | grep -q .; then docker rmi $IMAGE_NAME log_success "Image supprimée" fi # Nettoyer les volumes non utilisés docker volume prune -f # Nettoyer les images non utilisées docker image prune -f log_success "Nettoyage terminé" } # Afficher l'aide show_help() { echo "Usage: $0 [COMMAND]" echo "" echo "Commands:" echo " build Construire l'image Docker" echo " start Démarrer le conteneur" echo " stop Arrêter le conteneur" echo " restart Redémarrer le conteneur" echo " logs Afficher les logs" echo " clean Nettoyer les ressources Docker" echo " status Afficher le statut du conteneur" echo " help Afficher cette aide" echo "" echo "Exemples:" echo " $0 build && $0 start # Construire et démarrer" echo " $0 logs # Voir les logs en temps réel" echo " $0 clean # Nettoyer tout" } # Afficher le statut show_status() { log_info "Statut du conteneur:" docker ps -f name=$CONTAINER_NAME --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" if docker ps -q -f name=$CONTAINER_NAME | grep -q .; then log_success "Conteneur en cours d'exécution" log_info "Interface: http://localhost:$PORT" else log_warning "Conteneur arrêté" fi } # Fonction principale main() { # Vérifier Docker check_docker # Traiter la commande case "${1:-help}" in build) build_image ;; start) start_container ;; stop) stop_container ;; restart) restart_container ;; logs) show_logs ;; clean) clean_docker ;; status) show_status ;; help|--help|-h) show_help ;; *) log_error "Commande inconnue: $1" show_help exit 1 ;; esac } # Exécuter la fonction principale main "$@"