# --- Этап 1: Сборка (Builder) ---
# Используем официальный образ Go в качестве сборочной среды
FROM golang:1.24-alpine AS builder

# Устанавливаем рабочую директорию внутри контейнера
WORKDIR /app

# Копируем файлы go.mod и go.sum для загрузки зависимостей
COPY go.mod go.sum ./
# Загружаем зависимости. Этот слой будет кэшироваться, если файлы не менялись
RUN go mod download

# Копируем весь остальной исходный код
COPY . .

# Собираем наше приложение.
# -o /app/server: указывает, куда положить скомпилированный бинарный файл.
# -ldflags "-w -s": уменьшает размер бинарника, удаляя отладочную информацию.
# CGO_ENABLED=0: отключает CGO для статической линковки, что важно для Alpine.
RUN CGO_ENABLED=0 GOOS=linux go build -o /app/server -ldflags="-w -s" ./cmd/server

# --- Этап 2: Финальный образ (Final) ---
# Используем минималистичный образ Alpine. Он не содержит ничего лишнего.
FROM alpine:latest

# Устанавливаем рабочую директорию
WORKDIR /app

# Копируем только скомпилированный бинарник из этапа сборки
COPY --from=builder /app/server .

# (Опционально, но хорошая практика) Добавляем сертификаты для HTTPS-запросов из нашего приложения
RUN apk --no-cache add ca-certificates

# (Опционально, но хорошая практика) Запускаем приложение от имени непривилегированного пользователя
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

# Указываем, что контейнер будет слушать порт 8080
EXPOSE 8080

# Команда для запуска нашего приложения при старте контейнера
ENTRYPOINT ["/app/server"]
