Писал ли Dockerfile

«Писал ли Dockerfile» — вопрос из категории Docker, который задают на 46% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, постоянно. Dockerfile — это основа моей работы по упаковке приложений. Я пишу их с учетом безопасности, производительности и воспроизводимости сборок.

Типичный рабочий процесс и лучшие практики, которые я применяю:

  1. Выбор минимального базового образа: Например, alpine или -slim-версии, чтобы уменьшить размер и поверхность для атак.
  2. Многоступенчатые сборки (Multi-stage builds): Для отделения среды сборки (со всеми компиляторами и dev-зависимостями) от финального рантайм-образа.
  3. Правильное копирование и кеширование слоев: Сначала копирую файлы зависимостей (requirements.txt, package.json), устанавливаю их, а уже потом копирую весь исходный код. Это позволяет использовать кеш Docker при изменении только кода.
  4. Использование .dockerignore: Исключаю из образа ненужные файлы (логи, временные файлы, .git), что ускоряет сборку и повышает безопасность.
  5. Запуск от непривилегированного пользователя: Создаю и переключаюсь на не-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"]