Ответ
Да, постоянно. Для разных проектов я создаю образы, начиная от базовых (с установленным 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"]