[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-bezopasnost-konteynerov-zachem-ispolzovat-minimalnye-bazovye-obrazy-i-kakie-varianty-sushchestvuyut":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":21,"progress":22,"seo":23},310,"zachem-ispolzovat-minimalnye-bazovye-obrazy-i-kakie-varianty-sushchestvuyut",9,"bezopasnost-konteynerov","Безопасность контейнеров","🛡️","Зачем использовать минимальные базовые образы и какие варианты существуют?","Минимальный базовый образ -- это образ контейнера, содержащий только компоненты, необходимые для запуска приложения, что сокращает поверхность атаки (attack surface), уменьшает размер и количество потенциальных уязвимостей.\n\nАналогия: если вы переезжаете в новую квартиру, вы берёте только нужные вещи. Оставлять в образе компилятор, отладчик и пакетный менеджер -- всё равно что привезти с собой набор отмычек и оставить его на видном месте.\n\n### Сравнение базовых образов для Java\n\n| Образ | Размер | Shell | Package Manager | Уязвимости* |\n|-------|--------|-------|-----------------|-------------|\n| `eclipse-temurin:21-jdk` | ~470 MB | Да | apt | Много |\n| `eclipse-temurin:21-jre` | ~270 MB | Да | apt | Средне |\n| `eclipse-temurin:21-jre-alpine` | ~90 MB | Да (ash) | apk | Мало |\n| `gcr.io\u002Fdistroless\u002Fjava21-debian12` | ~230 MB | Нет | Нет | Минимум |\n\n*\\* -- примерная оценка количества потенциальных уязвимостей*\n\n### Alpine-based образы\n\n```dockerfile\nFROM eclipse-temurin:21-jre-alpine\n\nRUN addgroup -S app && adduser -S app -G app\nWORKDIR \u002Fapp\nCOPY --chown=app:app target\u002Fservice.jar \u002Fapp\u002Fapp.jar\nUSER app\n\nENTRYPOINT [\"java\", \"-jar\", \"\u002Fapp\u002Fapp.jar\"]\n```\n\nПреимущества: маленький размер (~90 MB), musl libc, минимум пакетов. Недостатки: возможна несовместимость с некоторыми нативными библиотеками, зависящими от glibc (например, некоторые JDBC-драйверы или библиотеки с JNI).\n\n### Google Distroless\n\n\u003Cdetails>\n\u003Csummary>Пример multistage build с Distroless\u003C\u002Fsummary>\n\n```dockerfile\n# Этап сборки\nFROM eclipse-temurin:21-jdk-alpine AS builder\nWORKDIR \u002Fbuild\nCOPY . .\nRUN .\u002Fmvnw clean package -DskipTests\n\n# Финальный образ\nFROM gcr.io\u002Fdistroless\u002Fjava21-debian12\n\nCOPY --from=builder \u002Fbuild\u002Ftarget\u002Fservice.jar \u002Fapp\u002Fapp.jar\nWORKDIR \u002Fapp\n\n# Distroless уже работает от nonroot (UID 65532)\nUSER nonroot:nonroot\n\nENTRYPOINT [\"java\", \"-jar\", \"\u002Fapp\u002Fapp.jar\"]\n```\n\n\u003C\u002Fdetails>\n\nDistroless-образы не содержат shell, пакетного менеджера и прочих утилит. Атакующий, даже проникнув в контейнер, **не сможет** выполнить `sh`, `bash`, `curl`, `wget`. Для отладки существует debug-вариант `gcr.io\u002Fdistroless\u002Fjava21-debian12:debug` с busybox shell.\n\n### Собственный минимальный образ с jlink (Java 9+)\n\n\u003Cdetails>\n\u003Csummary>Пример Dockerfile с кастомным JRE через jlink\u003C\u002Fsummary>\n\n```dockerfile\nFROM eclipse-temurin:21-jdk-alpine AS builder\n\nWORKDIR \u002Fbuild\nCOPY . .\nRUN .\u002Fmvnw clean package -DskipTests\n\n# Создаём кастомный JRE только с нужными модулями\nRUN jlink \\\n    --add-modules java.base,java.sql,java.naming,java.management,java.logging \\\n    --strip-debug \\\n    --no-man-pages \\\n    --no-header-files \\\n    --compress=zip-9 \\\n    --output \u002Fcustom-jre\n\nFROM alpine:3.20\nCOPY --from=builder \u002Fcustom-jre \u002Fopt\u002Fjava\nCOPY --from=builder \u002Fbuild\u002Ftarget\u002Fservice.jar \u002Fapp\u002Fapp.jar\n\nRUN addgroup -S app && adduser -S app -G app\nUSER app\n\nENV JAVA_HOME=\u002Fopt\u002Fjava\nENV PATH=\"${JAVA_HOME}\u002Fbin:${PATH}\"\n\nENTRYPOINT [\"java\", \"-jar\", \"\u002Fapp\u002Fapp.jar\"]\n```\n\n\u003C\u002Fdetails>\n\nРезультат: образ ~60 MB вместо 470 MB, содержит только нужные Java-модули.\n\n### Рекомендации для production\n\n- **Production:** `distroless` или `alpine` + jlink.\n- **Staging\u002FQA:** `alpine`-варианты (есть shell для отладки).\n- **Фиксация версии:** никогда не использовать тег `latest` -- всегда указывать версию с SHA256-дайджестом: `eclipse-temurin:21-jre-alpine@sha256:abc123...`\n\n### Вывод\n\nВыбор минимального базового образа -- один из самых эффективных способов уменьшить количество уязвимостей. Distroless-образы дают наилучшую защиту для production, а jlink позволяет создать ещё более компактный образ с кастомным JRE.\n\n> **На собеседовании:** назовите 3-4 варианта образов (jdk, jre, alpine, distroless), объясните разницу в размере и безопасности. Упомяните jlink как продвинутый приём -- это выделит вас среди кандидатов.","","junior",[15,16,17,18,19,20],"base-image","alpine","container-security","jlink","distroless","docker",[],null,{"title":24,"description":25,"ogTitle":26,"ogDescription":27,"keywords":28,"schemaAnswer":34,"featuredSnippetReady":35},"Минимальные базовые образы для Java — Alpine, Distroless, jlink — Gymterview","Сравнение базовых образов для Java: eclipse-temurin JDK\u002FJRE, Alpine, Google Distroless, кастомный JRE через jlink. Размер, attack surface, уязвимости.","Минимальные базовые образы для Java — Alpine vs Distroless vs jlink","Alpine (~90 MB), Distroless (~230 MB без shell), jlink (~60 MB). Чем меньше компонентов — тем меньше поверхность атаки и уязвимостей.",[29,30,31,32,33],"минимальные базовые образы Docker","distroless Java","Alpine JRE","jlink Docker","attack surface контейнер","Чем меньше компонентов в образе, тем меньше поверхность атаки. Варианты для Java: Alpine-based (~90 MB, есть shell), Google Distroless (~230 MB, без shell и пакетного менеджера), кастомный JRE через jlink (~60 MB, только нужные модули). Для production рекомендуется distroless или alpine с jlink.",true]