Ответ
Да, постоянно. Dockerfile — это основа моей работы по упаковке приложений. Я пишу их с учетом безопасности, производительности и воспроизводимости сборок.
Типичный рабочий процесс и лучшие практики, которые я применяю:
- Выбор минимального базового образа: Например,
alpineили-slim-версии, чтобы уменьшить размер и поверхность для атак. - Многоступенчатые сборки (Multi-stage builds): Для отделения среды сборки (со всеми компиляторами и dev-зависимостями) от финального рантайм-образа.
- Правильное копирование и кеширование слоев: Сначала копирую файлы зависимостей (
requirements.txt,package.json), устанавливаю их, а уже потом копирую весь исходный код. Это позволяет использовать кеш Docker при изменении только кода. - Использование
.dockerignore: Исключаю из образа ненужные файлы (логи, временные файлы,.git), что ускоряет сборку и повышает безопасность. - Запуск от непривилегированного пользователя: Создаю и переключаюсь на не-root пользователя внутри контейнера для повышения безопасности.
Пример Dockerfile для Go-приложения с multi-stage build:
# Этап сборки
FROM golang:1.19-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /myapp
# Финальный этап
FROM alpine:latest
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /root/
# Копируем только бинарник из этапа сборки
COPY --from=builder /myapp .
# Меняем владельца файла
RUN chown appuser:appgroup /root/myapp
USER appuser
CMD ["./myapp"] Видео-ответы
▶
▶
▶
▶
▶
▶
▶