Проверяет понимание multi-stage build в Docker и умение оптимизировать образы за счёт разделения этапов сборки и рантайма.
Multi-stage build — это возможность Dockerfile содержать несколько инструкций FROM, каждая из которых начинает новый этап сборки. Каждый этап может использовать свой базовый образ и выполнять свои команды, а результат предыдущего этапа можно копировать в последующий через COPY --from=. В финальный образ попадает только то, что вы явно скопировали, всё остальное остаётся в промежуточных слоях и не влияет на итоговый размер.
# Этап сборки
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Этап рантайма
FROM node:20-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY package*.json ./
RUN npm ci --omit=dev
COPY --from=build /app/dist ./dist
CMD ["node", "dist/index.js"]
Здесь первый этап содержит все dev-зависимости и собирает проект, а второй — только production-зависимости и готовый dist. Итоговый образ не содержит исходников и инструментов сборки.
FROM golang:1.22 AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /app/server ./cmd/server
FROM scratch
COPY --from=build /app/server /server
ENTRYPOINT ["/server"]
Финальный образ на базе scratch содержит только статически скомпилированный бинарник — размер может быть всего несколько мегабайт.
AS name упрощает ссылки в COPY --from=name.docker build --target build — удобно для отладки.Multi-stage build стоит применять всегда, когда в проекте есть этап компиляции или сборки: Go, Rust, Java, TypeScript, фронтенд. Это стандартный способ получать компактные и безопасные production-образы без ручной очистки.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию