[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-docker-chto-takoe-multi-stage-build-i-zachem-on-nuzhen":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},1081,"chto-takoe-multi-stage-build-i-zachem-on-nuzhen",17,"docker","Docker","🐳","Что такое multi-stage build и зачем он нужен?","Multi-stage build (многоступенчатая сборка) — это подход, при котором в одном Dockerfile используется несколько инструкций FROM, где каждая начинает новую стадию сборки, а в финальный образ попадает только результат последней стадии.\n\n### Зачем нужен\n\n- Разделение среды сборки и среды выполнения\n- Уменьшение размера финального образа — в него не попадают инструменты сборки (Maven, Gradle, JDK)\n- Один Dockerfile для всего процесса — от исходного кода до готового образа\n\n### Пример для Spring Boot приложения с Maven\n\n```dockerfile\n# --- Стадия 1: сборка ---\nFROM maven:3.9-eclipse-temurin-17 AS build\nWORKDIR \u002Fapp\nCOPY pom.xml .\n# Загружаем зависимости отдельным слоем (кэширование)\nRUN mvn dependency:go-offline -B\nCOPY src .\u002Fsrc\nRUN mvn package -DskipTests -B\n\n# --- Стадия 2: запуск ---\nFROM eclipse-temurin:17-jre-alpine\nWORKDIR \u002Fapp\n# Копируем только JAR из стадии сборки\nCOPY --from=build \u002Fapp\u002Ftarget\u002F*.jar app.jar\nEXPOSE 8080\nENTRYPOINT [\"java\", \"-jar\", \"app.jar\"]\n```\n\nРезультат: финальный образ содержит только JRE и JAR-файл, без Maven, JDK, исходного кода и промежуточных артефактов. Размер образа может уменьшиться с ~800 МБ до ~200 МБ.\n\n\u003Cdetails>\u003Csummary>Пример с Gradle\u003C\u002Fsummary>\n\n```dockerfile\nFROM gradle:8.5-jdk17 AS build\nWORKDIR \u002Fapp\nCOPY build.gradle settings.gradle .\u002F\nCOPY src .\u002Fsrc\nRUN gradle bootJar --no-daemon\n\nFROM eclipse-temurin:17-jre-alpine\nWORKDIR \u002Fapp\nCOPY --from=build \u002Fapp\u002Fbuild\u002Flibs\u002F*.jar app.jar\nEXPOSE 8080\nENTRYPOINT [\"java\", \"-jar\", \"app.jar\"]\n```\n\n\u003C\u002Fdetails>\n\n> **На собеседовании:** объясните главную идею: multi-stage build позволяет собирать приложение в одном контейнере (с JDK и Maven), а запускать в другом (только JRE). Это уменьшает размер образа и поверхность атаки. Покажите, что знаете синтаксис `COPY --from=build`.","","middle",[15,16,17,18,7],"multi-stage-build","optimization","dockerfile","spring-boot",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":35,"featuredSnippetReady":36},"Multi-stage build в Docker — Gymterview","Multi-stage build: несколько FROM в одном Dockerfile для разделения среды сборки и запуска. Пример для Spring Boot с Maven\u002FGradle, уменьшение размера образа.","Multi-stage build в Docker: зачем и как использовать — Gymterview","Multi-stage build разделяет сборку и запуск в одном Dockerfile. Уменьшает размер образа с 800 МБ до 200 МБ для Spring Boot.",[27,28,29,30,31,32,33,34],"multi-stage build","многоступенчатая сборка","Dockerfile","COPY --from","Docker оптимизация","Spring Boot Docker","Maven Docker","собеседование","Multi-stage build — подход с несколькими FROM в одном Dockerfile, где каждый начинает новую стадию, а в финальный образ попадает только результат последней. Позволяет собирать приложение в одном контейнере (JDK + Maven), а запускать в другом (только JRE). Уменьшает размер образа (с ~800 МБ до ~200 МБ) и поверхность атаки. Синтаксис: COPY --from=build копирует артефакт из стадии сборки.",true]