[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-docker-kak-optimizirovat-dockerfile":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},1083,"kak-optimizirovat-dockerfile",17,"docker","Docker","🐳","Как оптимизировать Dockerfile?","Оптимизация Dockerfile направлена на уменьшение размера образа и ускорение сборки за счёт правильной организации инструкций и выбора базовых образов.\n\n### 1. Правильный порядок инструкций (кэширование)\n\nИнструкции, которые меняются реже, должны быть в начале:\n\n```dockerfile\nCOPY pom.xml .\nRUN mvn dependency:go-offline\nCOPY src .\u002Fsrc\nRUN mvn package\n```\n\n### 2. Минимизация количества слоёв\n\nОбъединяйте команды RUN в одну инструкцию:\n\n```dockerfile\n# Плохо: 3 слоя\nRUN apt-get update\nRUN apt-get install -y curl\nRUN rm -rf \u002Fvar\u002Flib\u002Fapt\u002Flists\u002F*\n\n# Хорошо: 1 слой\nRUN apt-get update && \\\n    apt-get install -y curl && \\\n    rm -rf \u002Fvar\u002Flib\u002Fapt\u002Flists\u002F*\n```\n\n### 3. Используйте минимальные базовые образы\n\n- `eclipse-temurin:17-jre-alpine` (~80 МБ) вместо `eclipse-temurin:17-jdk` (~400 МБ)\n- Alpine-образы значительно меньше Debian\u002FUbuntu-основанных\n- Для production нужен JRE, а не JDK\n\n### 4. Удаляйте ненужное в том же слое\n\n```dockerfile\nRUN apt-get update && \\\n    apt-get install -y --no-install-recommends curl && \\\n    curl -o tool.tar.gz https:\u002F\u002Fexample.com\u002Ftool.tar.gz && \\\n    tar -xzf tool.tar.gz && \\\n    rm tool.tar.gz && \\\n    apt-get purge -y curl && \\\n    rm -rf \u002Fvar\u002Flib\u002Fapt\u002Flists\u002F*\n```\n\n### 5. Дополнительные практики\n\n- Используйте `.dockerignore` для исключения ненужных файлов из контекста сборки\n- Используйте multi-stage builds для разделения среды сборки и запуска\n- Не запускайте контейнер от root\n- Используйте конкретные теги образов вместо `latest`:\n\n```dockerfile\n# Плохо: непредсказуемый результат\nFROM eclipse-temurin:latest\n\n# Хорошо: воспроизводимая сборка\nFROM eclipse-temurin:17.0.9_9-jre-alpine\n```\n\n> **На собеседовании:** назовите минимум 4-5 практик. Самые важные: порядок инструкций для кэширования, минимальные базовые образы, multi-stage build, объединение RUN-команд, конкретные теги. Если можете объяснить почему каждая практика работает (через понимание слоёв) — это уровень middle+.","","middle",[15,16,17,18,7],"performance","optimization","dockerfile","best-practices",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":34,"featuredSnippetReady":35},"Оптимизация Dockerfile: лучшие практики — Gymterview","Оптимизация Dockerfile: порядок инструкций для кэширования, объединение RUN-команд, минимальные базовые образы (alpine), multi-stage build, конкретные теги.","Оптимизация Dockerfile: 5+ best practices — Gymterview","Как оптимизировать Dockerfile: кэширование слоёв, минимальные образы, multi-stage build, объединение RUN, конкретные теги.",[27,28,29,30,31,32,33],"оптимизация Dockerfile","Docker best practices","alpine образ","минимизация слоёв","Docker кэширование","dockerignore","собеседование","Ключевые практики: 1) Порядок инструкций — редко меняющиеся (зависимости) перед часто меняющимися (код) для кэширования. 2) Объединение RUN-команд в одну инструкцию. 3) Минимальные базовые образы (alpine, JRE вместо JDK). 4) Удаление временных файлов в том же слое. 5) Multi-stage build. 6) .dockerignore для исключения ненужных файлов. 7) Конкретные теги вместо latest.",true]