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