Skip to content

⚡️ perf: docker build cache 사용하도록 변경#526

Merged
Jo-Minseok merged 1 commit intoboostcampwm-2024:mainfrom
Jo-Minseok:perf/docker-cache
Feb 7, 2026
Merged

⚡️ perf: docker build cache 사용하도록 변경#526
Jo-Minseok merged 1 commit intoboostcampwm-2024:mainfrom
Jo-Minseok:perf/docker-cache

Conversation

@Jo-Minseok
Copy link
Member

@Jo-Minseok Jo-Minseok commented Jan 22, 2026

🔨 테스크

기존 이미지 빌드 스크립트가 제대로 캐싱을 못 사용하는 현상 발견

  • 기존 코드는 모든 코드를 다 가져와서 npm ci, npm run build를 수행하게 했었다.
  • 또한 npm ci && npm run build 처럼 매번 설치 및 빌드를 하는 비효율적 스크립트를 발견
  • 소스 코드만 바뀌어도 package.json이 변경되었다고 판단되어 npm ci를 매번 수행하는 문제 발생
  • package.json을 통해 모듈을 설치하는 부분은 별도 레이어로 캐싱하고, 소스 코드만 변경되었을 경우에는 캐싱을 통해 모듈 설치를 안 하도록 변경

수행 결과

  • Main Branch (캐싱 없음), (최초 빌드)s / (소스 코드 변경 후 빌드)s
    서버: 38s / 36s
    피드 크롤러: 18s / 17s
    이메일 워커: 18s / 18s

  • Perf/docker-cache Branch (npm ci 캐싱 적용), (최초 빌드)s / (소스 코드 변경 후 빌드)s
    서버: 37s / 22s
    피드 크롤러: 17s / 10s
    이메일 워커: 17s / 10s

  • 소스 코드 변경 후 재빌드 시 대폭 시간 단축:

    • 서버: 15초 단축 (~41% 개선)
    • 피드 크롤러: 7초 단축 (~41% 개선)
    • 이메일 워커: 7초 단축 (~41% 개선)
  • 벤치 마크 명령어

# Docker Build Time Measurement Script

$results = @{}

# Function to measure build time
function Measure-BuildTime {
    param(
        [string]$Name,
        [string]$Context,
        [string]$Dockerfile,
        [string]$Tag,
        [boolean]$NoCache = $true
    )

    Write-Host "`n=== Building $Name ===" -ForegroundColor Cyan
    $sw = [Diagnostics.Stopwatch]::StartNew()

    if ($NoCache) {
        docker build --no-cache -f $Dockerfile -t $Tag $Context 2>&1 | Out-Null
    } else {
        docker build -f $Dockerfile -t $Tag $Context 2>&1 | Out-Null
    }

    $sw.Stop()
    $seconds = [math]::Round($sw.Elapsed.TotalSeconds)
    Write-Host "$Name Build Time: $seconds seconds" -ForegroundColor Green
    return $seconds
}

Write-Host "Starting Docker Build Time Measurement..." -ForegroundColor Yellow
Write-Host "Current Branch: main" -ForegroundColor Yellow

# Clean up existing images and cache
Write-Host "`nCleaning up..." -ForegroundColor Yellow
docker builder prune -af 2>&1 | Out-Null

# 1. Initial build (no cache) - main branch
Write-Host "`n### 1. Initial Build (No Cache) - main branch ###" -ForegroundColor Magenta
$results["Server_Initial"] = Measure-BuildTime -Name "Server" -Context ".\server" -Dockerfile ".\server\docker\Dockerfile.local" -Tag "denamu-server:main" -NoCache $true
$results["FeedCrawler_Initial"] = Measure-BuildTime -Name "Feed Crawler" -Context ".\feed-crawler" -Dockerfile ".\feed-crawler\docker\Dockerfile.local" -Tag "denamu-feed-crawler:main" -NoCache $true
$results["EmailWorker_Initial"] = Measure-BuildTime -Name "Email Worker" -Context ".\email-worker" -Dockerfile ".\email-worker\docker\Dockerfile.local" -Tag "denamu-email-worker:main" -NoCache $true

# 2. Source code change and rebuild - main branch
Write-Host "`n### 2. Rebuild after source code change - main branch ###" -ForegroundColor Magenta

# Add a comment to source files
Add-Content -Path ".\server\src\main.ts" -Value "// Build test comment"
Add-Content -Path ".\feed-crawler\src\main.ts" -Value "// Build test comment"
Add-Content -Path ".\email-worker\src\main.ts" -Value "// Build test comment"

$results["Server_Rebuild"] = Measure-BuildTime -Name "Server" -Context ".\server" -Dockerfile ".\server\docker\Dockerfile.local" -Tag "denamu-server:main-rebuild" -NoCache $true
$results["FeedCrawler_Rebuild"] = Measure-BuildTime -Name "Feed Crawler" -Context ".\feed-crawler" -Dockerfile ".\feed-crawler\docker\Dockerfile.local" -Tag "denamu-feed-crawler:main-rebuild" -NoCache $true
$results["EmailWorker_Rebuild"] = Measure-BuildTime -Name "Email Worker" -Context ".\email-worker" -Dockerfile ".\email-worker\docker\Dockerfile.local" -Tag "denamu-email-worker:main-rebuild" -NoCache $true

# Revert changes
git checkout -- ".\server\src\main.ts"
git checkout -- ".\feed-crawler\src\main.ts"
git checkout -- ".\email-worker\src\main.ts"

# 3. Switch to perf/docker-cache branch
Write-Host "`n### 3. Switching to perf/docker-cache branch ###" -ForegroundColor Magenta
git checkout perf/docker-cache 2>&1 | Out-Null
docker builder prune -af 2>&1 | Out-Null

# 4. Initial build - perf/docker-cache branch
Write-Host "`n### 4. Initial Build (No Cache) - perf/docker-cache branch ###" -ForegroundColor Magenta
$results["Server_Perf_Initial"] = Measure-BuildTime -Name "Server (perf)" -Context ".\server" -Dockerfile ".\server\docker\Dockerfile.local" -Tag "denamu-server:perf" -NoCache $true
$results["FeedCrawler_Perf_Initial"] = Measure-BuildTime -Name "Feed Crawler (perf)" -Context ".\feed-crawler" -Dockerfile ".\feed-crawler\docker\Dockerfile.local" -Tag "denamu-feed-crawler:perf" -NoCache $true
$results["EmailWorker_Perf_Initial"] = Measure-BuildTime -Name "Email Worker (perf)" -Context ".\email-worker" -Dockerfile ".\email-worker\docker\Dockerfile.local" -Tag "denamu-email-worker:perf" -NoCache $true

# 5. Source code change and rebuild - perf/docker-cache branch
Write-Host "`n### 5. Rebuild after source code change - perf/docker-cache branch ###" -ForegroundColor Magenta

Add-Content -Path ".\server\src\main.ts" -Value "// Build test comment"
Add-Content -Path ".\feed-crawler\src\main.ts" -Value "// Build test comment"
Add-Content -Path ".\email-worker\src\main.ts" -Value "// Build test comment"

$results["Server_Perf_Rebuild"] = Measure-BuildTime -Name "Server (perf)" -Context ".\server" -Dockerfile ".\server\docker\Dockerfile.local" -Tag "denamu-server:perf-rebuild" -NoCache $false
$results["FeedCrawler_Perf_Rebuild"] = Measure-BuildTime -Name "Feed Crawler (perf)" -Context ".\feed-crawler" -Dockerfile ".\feed-crawler\docker\Dockerfile.local" -Tag "denamu-feed-crawler:perf-rebuild" -NoCache $false
$results["EmailWorker_Perf_Rebuild"] = Measure-BuildTime -Name "Email Worker (perf)" -Context ".\email-worker" -Dockerfile ".\email-worker\docker\Dockerfile.local" -Tag "denamu-email-worker:perf-rebuild" -NoCache $false

# Revert changes and switch back to main
git checkout -- ".\server\src\main.ts"
git checkout -- ".\feed-crawler\src\main.ts"
git checkout -- ".\email-worker\src\main.ts"
git checkout main 2>&1 | Out-Null

# Display results
Write-Host "`n`n=======================" -ForegroundColor Yellow
Write-Host "BUILD TIME RESULTS" -ForegroundColor Yellow
Write-Host "=======================" -ForegroundColor Yellow

Write-Host "`nMain Branch:" -ForegroundColor Cyan
Write-Host "서버: $($results['Server_Initial'])s / $($results['Server_Rebuild'])s"
Write-Host "피드 크롤러: $($results['FeedCrawler_Initial'])s / $($results['FeedCrawler_Rebuild'])s"
Write-Host "이메일 워커: $($results['EmailWorker_Initial'])s / $($results['EmailWorker_Rebuild'])s"

Write-Host "`nperf/docker-cache Branch:" -ForegroundColor Cyan
Write-Host "서버: $($results['Server_Perf_Initial'])s / $($results['Server_Perf_Rebuild'])s"
Write-Host "피드 크롤러: $($results['FeedCrawler_Perf_Initial'])s / $($results['FeedCrawler_Perf_Rebuild'])s"
Write-Host "이메일 워커: $($results['EmailWorker_Perf_Initial'])s / $($results['EmailWorker_Perf_Rebuild'])s"

Write-Host "`nNote: Times shown as 'Initial / Rebuild'" -ForegroundColor Gray

📋 작업 내용

  • Docker Local, Prod 환경 이미지 빌드 시간 개선

📷 스크린 샷(선택 사항)

동작 화면 첨부

@Jo-Minseok Jo-Minseok added the ⚡ Performance 성능 개선 label Jan 22, 2026
@Jo-Minseok Jo-Minseok self-assigned this Jan 22, 2026
Copy link
Collaborator

@CodeVac513 CodeVac513 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@Jo-Minseok Jo-Minseok merged commit 57a9058 into boostcampwm-2024:main Feb 7, 2026
4 checks passed
@Jo-Minseok Jo-Minseok deleted the perf/docker-cache branch February 7, 2026 07:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

⚡ Performance 성능 개선

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants