# --- Этап 1: Сборка (Builder) --- # Используем официальный образ Go в качестве сборочной среды FROM golang:1.24-alpine AS builder # Устанавливаем рабочую директорию внутри контейнера WORKDIR /app # Копируем файлы go.mod и go.sum для загрузки зависимостей COPY go.mod go.sum ./ # Загружаем зависимости. Этот слой будет кэшироваться, если файлы не менялись ENV GOPROXY=direct RUN apk add --no-cache git 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"]