<# .SYNOPSIS Construit l'image Docker avec toutes les dépendances requises via PowerShell et WSL (Debian). .DESCRIPTION Ce script prépare les dépendances et construit l'image Docker sous WSL (Debian) avec BuildKit activé pour des builds plus rapides. .PARAMETRES -full : Si présent, effectue une construction complète de l'image Docker (équivalent à --no-cache). .EXEMPLE .\build-img.ps1 # Construction rapide (avec cache) .\build-img.ps1 -full # Construction complète sans cache .RETOURNE Affiche le succès ou les erreurs pendant la construction de l'image Docker. #> param( [switch]$full ) $ErrorActionPreference = 'Stop' try { # Determine paths $scriptDir = $PSScriptRoot $projectRoot = (Get-Item (Join-Path $scriptDir '..')).FullName # Convert Windows path to WSL path (manual, no wslpath) $wslProjectRoot = $projectRoot -replace '^([A-Za-z]):\\','/mnt/$1/' -replace '\\','/' $wslProjectRoot = $wslProjectRoot.ToLower() # Check if Docker is available in WSL Debian Write-Host "Vérification de Docker dans WSL Debian..." -ForegroundColor Cyan $dockerCheck = wsl -d Debian bash -c "docker --version" 2>&1 if ($LASTEXITCODE -ne 0) { Write-Error "Docker n'est pas disponible dans WSL Debian : $dockerCheck" exit 1 } Write-Host "Docker détecté : $dockerCheck" -ForegroundColor Green # Check if the Dockerfile exists $dockerfilePath = Join-Path $scriptDir "Dockerfile" if (-not (Test-Path $dockerfilePath)) { Write-Error "Le fichier Dockerfile n'existe pas dans $scriptDir" exit 1 } # Check if .dockerignore exists, warn if not $dockerignorePath = Join-Path $projectRoot ".dockerignore" if (-not (Test-Path $dockerignorePath)) { Write-Warning "Aucun fichier .dockerignore trouvé. Créez-en un pour optimiser le build." Write-Host "Exemple de contenu :" -ForegroundColor Yellow Write-Host @" node_modules dist .git .angular .vscode *.log tmp db/*.db .env "@ -ForegroundColor DarkGray } # Compose build command with BuildKit enabled $noCache = if ($full) { '--no-cache' } else { '' } # Escape spaces in path for bash $escapedPath = $wslProjectRoot -replace ' ','\\ ' # Build command parts $cdCmd = "cd `"$wslProjectRoot`"" $dockerCmd = "docker build $noCache --progress=plain -t obsiviewer-angular:latest -f docker/Dockerfile ." # Complete command with BuildKit $innerCmd = "export DOCKER_BUILDKIT=1 && $cdCmd && $dockerCmd" # Run build inside WSL Debian to use Linux Docker daemon Write-Host "Construction de l'image Docker obsiviewer-angular:latest..." -ForegroundColor Cyan Write-Host "BuildKit activé pour un build optimisé avec cache" -ForegroundColor Cyan $buildResult = wsl -d Debian bash -lc $innerCmd 2>&1 # Display build output $buildResult | ForEach-Object { Write-Host $_ } if ($LASTEXITCODE -ne 0) { Write-Error "Erreur lors de la construction de l'image Docker (code: $LASTEXITCODE)" exit 1 } # Verify the image was built successfully $verifyCmd = "docker image inspect obsiviewer-angular:latest --format='{{.Size}}'" Write-Host "`nVérification de l'image construite..." -ForegroundColor Cyan $imageSize = wsl -d Debian bash -lc $verifyCmd 2>&1 if ($LASTEXITCODE -ne 0) { Write-Error "L'image Docker n'a pas été construite correctement : $imageSize" exit 1 } # Convert size to MB $sizeMB = [math]::Round([long]$imageSize / 1MB, 2) Write-Host "`n================================================" -ForegroundColor Green Write-Host "✓ Image Docker construite avec succès" -ForegroundColor Green Write-Host " Nom: obsiviewer-angular:latest" -ForegroundColor Green Write-Host " Taille: $sizeMB MB" -ForegroundColor Green Write-Host "================================================" -ForegroundColor Green # Display tips for faster rebuilds if (-not $full) { Write-Host "`nConseils pour les prochains builds :" -ForegroundColor Cyan Write-Host " • Les dépendances npm sont mises en cache" -ForegroundColor Gray Write-Host " • Le cache Angular est préservé entre les builds" -ForegroundColor Gray Write-Host " • Seuls les fichiers modifiés déclencheront un rebuild" -ForegroundColor Gray } } catch { Write-Error "Erreur lors de la construction de l'image Docker : $_" exit 1 }