Cross-compilation

Тема дорожной карты · Golang

Кросс-компиляция в Go — возможность создавать бинарники для операционной системы или архитектуры процессора, отличных от той, на которой запущен компилятор, и это одна из наиболее ценимых особенностей Go. Достаточно установить переменные окружения GOOS и GOARCH перед вызовом go build: например, GOOS=linux GOARCH=arm64 go build -o app ./cmd/server создаст бинарник для Linux ARM64 на macOS-машине разработчика. Go поставляется со встроенной поддержкой всех основных комбинаций платформ — Linux, Windows, macOS, FreeBSD и архитектур amd64, arm64, 386, riscv64 и других — без необходимости отдельного C-тулчейна при CGO_ENABLED=0. Кросс-компиляция — краеугольный камень Docker-развёртываний Go: многоэтапные Dockerfile компилируют статический бинарник для linux/amd64 или linux/arm64 и копируют его в базовый образ scratch или distroless, создавая минимальный контейнер без следа OS. Go Modules (go.mod) гарантируют, что один и тот же граф зависимостей разрешается при кросс-компиляции, делая сборки полностью воспроизводимыми в разных средах.

Как это работает

Cross-compilation знаменито прост: go build создаёт один статический бинарь, запускаемый на любом хосте с тем же OS+arch. Кросс-компиляция через GOOS=linux GOARCH=amd64 go build. Контейнеризуйте бинарь через FROM scratch или FROM gcr.io/distroless/static (несколько МБ total). go build -ldflags="-s -w" — для удаления debug-символов (меньше бинарь). Health-эндпойнты: /healthz, /readyz. Graceful shutdown через http.Server.Shutdown(ctx).

Когда применять

Multi-stage Dockerfile: builder-образ гонит go build; runner — scratch или distroless с одним бинарём + CA-сертификатами. Всегда graceful SIGTERM — drain in-flight запросы до выхода. Версию встраивайте через -ldflags "-X main.Version=$(git describe)" для вывода myapp version. Запуск под non-root, read-only ФС, минимальные capabilities.

Типичные ошибки

Ловушки Cross-compilation: FROM alpine, но компиляция против glibc (CGO_ENABLED=1 + alpine = мистические крэши — используйте CGO_ENABLED=0); нет CA-сертификатов в scratch-образах (TLS валится x509-ошибками — добавьте ca-certificates); нет graceful shutdown (k8s rolling-деплои дропают in-flight запросы); огромные бинари из-за забытых -w -s-флагов.

Связанные понятия

Полезные ресурсы