File size: 5,093 Bytes
ce475c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#!/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 "$@"