Files
backend/Dockerfile

46 lines
2.3 KiB
Docker

# --- Этап 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"]