Создавал ли собственные Docker-образы?

«Создавал ли собственные Docker-образы?» — вопрос из категории DevOps, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, постоянно. Для разных проектов я создаю образы, начиная от базовых (с установленным runtime, например, OpenJDK), заканчивая образами для сборки и деплоя приложений.

Ключевые практики, которые я применяю:

  • Использование многоэтапной сборки (multi-stage build): Это позволяет отделить этап сборки (со всеми компиляторами и зависимостями) от финального рантайм-образа, что сильно уменьшает его размер.
  • Минимизация слоев: Объединение связанных команд RUN и очистка кэша пакетного менеджера в одном слое.
  • Безопасность: Запуск процессов от непривилегированного пользователя (не root).
  • .dockerignore: Обязательно использую, чтобы не копировать в контекст сборки служебные директории (.git, target/, node_modules).

Пример Dockerfile для Spring Boot приложения:

# Этап сборки
FROM maven:3.8-eclipse-temurin-17 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package -DskipTests

# Финальный образ
FROM eclipse-temurin:17-jre-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]