How to Reduce Docker Image Size with PHP: Best Practices

How to Reduce Docker Image Size with PHP: Best Practices

Reducing the size of Docker images can lead to faster builds, deployments, and better performance in production environments. This guide covers essential techniques to minimize Docker image size for PHP applications.

1. Multi-Stage Build for Laravel Optimization

Multi-stage builds help create smaller final images by separating build steps and production artifacts.

Example:

# Stage 1: Build Stage
FROM php:8.2-cli as build
WORKDIR /app
COPY . .
RUN composer install --no-dev --optimize-autoloader

# Stage 2: Production Stage
FROM php:8.2-fpm-alpine
WORKDIR /app
COPY --from=build /app /app
CMD ["php-fpm"]

Benefits:

  • Reduces final image size by excluding development tools.
  • Ensures only production-ready files are included.
  • Improves build speed with layer optimization.

2. Minimalist PHP Image: Using Alpine Linux

Alpine Linux is a lightweight distribution ideal for minimizing Docker image size.

Example:

FROM php:8.2-fpm-alpine
WORKDIR /app
COPY . .
RUN apk add --no-cache bash
CMD ["php-fpm"]

Advantages:

  • Drastically smaller image size.
  • Reduced attack surface due to fewer packages.
  • Faster download and startup times.

Considerations:

  • May lack some libraries; ensure necessary packages are installed.

3. Layer Caching in Dockerfile

Proper use of layer caching can speed up the build process significantly.

Example:

FROM php:8.2-cli
WORKDIR /app
COPY composer.json composer.lock /app/
RUN composer install --no-dev --optimize-autoloader
COPY . .
CMD ["php", "artisan", "serve"]

Key Insight:

  • Place frequently changing files at the bottom of the Dockerfile.
  • Cache dependencies separately for faster builds.
  • Clean up unused layers where possible.

4. Creating a Custom Image for PHP and Go

Combining multiple languages in a single image can be useful for polyglot projects.

Example:

FROM php:8.2-cli AS php
WORKDIR /app
COPY . .
RUN composer install

FROM golang:1.21-alpine AS go
WORKDIR /app
COPY . .
RUN go build -o app

# Final Image
FROM alpine:latest
WORKDIR /app
COPY --from=php /app /app
COPY --from=go /app/app /usr/local/bin/app
CMD ["/usr/local/bin/app"]

Advantages:

  • Keeps PHP and Go builds separate but combines results.
  • Optimized for microservices and multi-language projects.
  • Reduces final image size by discarding intermediate build artifacts.

5. Optimizing PHP Extensions and Dependencies

Reducing unnecessary PHP extensions can shrink the image size.

Example:

RUN docker-php-ext-install pdo pdo_mysql

Tips:

  • Use --no-cache when installing packages.
  • Remove development dependencies from composer.json.

6. Cleaning Up Temporary Files and Caches

To further reduce image size, clean up temporary files and caches during the build process.

Example:

RUN rm -rf /var/cache/apk/* /tmp/* /usr/share/man /usr/share/doc

Key Benefits:

  • Minimizes the image footprint.
  • Reduces the risk of vulnerabilities.

Conclusion

By following these best practices, you can significantly reduce Docker image sizes, leading to faster build times, better security, and improved efficiency. Try implementing these strategies for your next PHP project and experience the benefits firsthand. Always balance size reduction with maintaining functionality and security for optimal results.

Useful Links

Recent blogs
Структурные паттерны в программировании

Структурные паттерны в программировании

Порождающие паттерны в программировании

Порождающие паттерны в программировании

Генераторы и итераторы в PHP

Генераторы и итераторы в PHP

Объектно-ориентированное программирование в PHP

Объектно-ориентированное программирование в PHP

Структуры данных в PHP

Структуры данных в PHP