acc-analyze-docker-image-size

📁 dykyi-roman/awesome-claude-code 📅 2 days ago
1
总安装量
1
周安装量
#49390
全站排名
安装命令
npx skills add https://github.com/dykyi-roman/awesome-claude-code --skill acc-analyze-docker-image-size

Agent 安装分布

opencode 1
claude-code 1

Skill 文档

Docker Image Size Analysis

Analyze Docker images for PHP projects to identify bloat sources and provide size reduction strategies.

Expected Size Ranges

Base Image Minimal Typical Bloated
php:8.4-fpm-alpine 30-50 MB 80-120 MB 200+ MB
php:8.4-fpm (Debian) 150-200 MB 250-350 MB 500+ MB
php:8.4-cli-alpine 25-40 MB 60-100 MB 180+ MB

Common Bloat Sources

1. Build Dependencies Not Cleaned

# BLOATED: Dev packages remain in final image
RUN apk add --no-cache $PHPIZE_DEPS icu-dev libzip-dev \
    && docker-php-ext-install intl zip

# OPTIMIZED: Remove build deps after compilation
RUN apk add --no-cache --virtual .build-deps $PHPIZE_DEPS icu-dev libzip-dev \
    && docker-php-ext-install intl zip \
    && apk del .build-deps \
    && apk add --no-cache icu-libs libzip

2. Vendor with Dev Dependencies

# BLOATED: Includes dev dependencies (+30-80MB)
RUN composer install

# OPTIMIZED: No dev dependencies, optimized autoloader
RUN composer install --no-dev --no-scripts --prefer-dist --optimize-autoloader

3. Full Debian Instead of Alpine

# BLOATED: Full Debian base (~150MB base)
FROM php:8.4-fpm

# OPTIMIZED: Alpine base (~30MB base)
FROM php:8.4-fpm-alpine

4. Package Manager Cache

# BLOATED: apt cache retained (~30-50MB)
RUN apt-get update && apt-get install -y libicu-dev

# OPTIMIZED: Clean apt cache in same layer
RUN apt-get update && apt-get install -y --no-install-recommends libicu-dev \
    && rm -rf /var/lib/apt/lists/*

5. Missing .dockerignore

.git
node_modules
vendor
tests
docs
var/cache
var/log
docker-compose*.yml
.env.local
*.md
Makefile

Size Estimation by Component

Component Typical Size Notes
Alpine base 5-8 MB Minimal Linux
Debian slim base 70-90 MB More packages available
PHP runtime 25-40 MB Core PHP binaries
PHP extensions (5-8) 10-30 MB Depends on extensions
Composer vendor (no-dev) 20-60 MB Depends on packages
Composer vendor (with-dev) 50-150 MB PHPUnit, etc.
Application code 1-10 MB Source files only
Build dependencies 50-200 MB Must be cleaned

Multi-Stage Build (Best Practice)

FROM php:8.4-fpm-alpine AS builder
RUN apk add --no-cache --virtual .build-deps $PHPIZE_DEPS icu-dev libzip-dev \
    && docker-php-ext-install intl zip opcache \
    && apk del .build-deps
COPY composer.json composer.lock ./
RUN composer install --no-dev --prefer-dist --optimize-autoloader

FROM php:8.4-fpm-alpine AS runtime
RUN apk add --no-cache icu-libs libzip
COPY --from=builder /usr/local/lib/php/extensions/ /usr/local/lib/php/extensions/
COPY --from=builder /usr/local/etc/php/conf.d/ /usr/local/etc/php/conf.d/
COPY --from=builder /var/www/vendor /var/www/vendor
COPY . /var/www/

Grep Patterns

# Find base images used
Grep: "^FROM " --glob "**/Dockerfile*"

# Find missing cache cleanup
Grep: "apt-get install" --glob "**/Dockerfile*"
Grep: "apk add(?!.*--no-cache)" --glob "**/Dockerfile*"

# Find composer install without --no-dev
Grep: "composer install(?!.*--no-dev)" --glob "**/Dockerfile*"

# Find COPY . (copies everything)
Grep: "^COPY \. " --glob "**/Dockerfile*"

# Check for .dockerignore
Glob: "**/.dockerignore"

# Find multi-stage builds
Grep: "^FROM.*AS " --glob "**/Dockerfile*"

Reduction Impact

Strategy Size Reduction Effort
Alpine instead of Debian 100-150 MB Low
Multi-stage build 50-200 MB Medium
Remove build deps 50-200 MB Low
–no-dev Composer 30-80 MB Low
Clean apt/apk cache 20-50 MB Low
.dockerignore 10-500 MB Low

Severity Classification

Pattern Severity Typical Waste
No multi-stage, build deps remain Critical 100-300 MB
No .dockerignore, .git copied Critical 50-500 MB
Debian instead of Alpine (no reason) Major 100-150 MB
Composer with dev dependencies Major 30-80 MB
APT/APK cache not cleaned Minor 20-50 MB

Output Format

### Image Size Issue: [Category]

**Severity:** Critical/Major/Minor
**Current Size:** X MB
**Estimated Savings:** Y MB
**Layer:** Dockerfile:line

**Issue:**
[Description of the bloat source]

**Current:**
```dockerfile
// Current Dockerfile instruction

Optimized:

// Optimized Dockerfile instruction

Expected Size After Fix: Before: X MB -> After: Z MB (saved Y MB)