46 lines
2.3 KiB
Docker
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"]
|