Ответ
Для сборки 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 может использовать кэшированный слой для загрузки модулей, ускоряя последующие сборки.