Как собрать приложение в Docker

Ответ

Для сборки Go-приложения в Docker нужно создать Dockerfile и выполнить команду docker build.

Пример для Go-приложения (многоэтапная сборка):

# Используем официальный образ Go для сборки
FROM golang:1.21 as builder

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

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

# Копируем исходный код и собираем приложение
COPY . .
# CGO_ENABLED=0: отключает CGO, создавая статически слинкованный бинарник
# GOOS=linux: указывает целевую ОС для компиляции
RUN CGO_ENABLED=0 GOOS=linux go build -o /app/main .

# Используем минимальный образ для запуска (уменьшает размер итогового образа)
FROM alpine:latest
WORKDIR /app
# Копируем собранный бинарник из предыдущего этапа
COPY --from=builder /app/main .

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

Сборка и запуск Docker-образа:

docker build -t my-go-app .
docker run -p 8080:8080 my-go-app

Оптимизации, примененные в примере:

  • Многоэтапная сборка (FROM ... as builder): Позволяет использовать большой образ с инструментами для сборки, а затем копировать только готовый бинарник в минимальный образ для запуска. Это значительно уменьшает итоговый размер Docker-образа.
  • Отключение CGO (CGO_ENABLED=0): Создает статически слинкованный бинарник, который не зависит от системных библиотек целевой ОС, что позволяет использовать очень маленькие базовые образы, такие как alpine.
  • Использование alpine: alpine — это очень маленький дистрибутив Linux, который идеально подходит для создания минимальных Docker-образов.
  • Кэширование зависимостей (COPY go.mod go.sum ./ перед COPY . .): Если файлы go.mod и go.sum не меняются, Docker может использовать кэшированный слой для загрузки модулей, ускоряя последующие сборки.