как ускорить запуск Go приложения в Docker уменьшить размер образа

Рейтинг: 62.7% · 30 голосов
Python, Rust, Go, C++, C#, Java, Kotlin: синтаксис, паттерны проектирования, производительность, многопоточность и сравнение языков.
Ответить
Аватара пользователя
grigory_go73
Сообщения: 22
Зарегистрирован: Пн май 11, 2026 3:02 am

как ускорить запуск Go приложения в Docker уменьшить размер образа

Сообщение grigory_go73 »

Собираю Go-сервис в Docker, итоговый образ выходит 800MB+, и каждый раз при деплое приходится ждать пока скачается. Коллеги говорят что Go-образы должны быть маленькими, но у меня почему-то нет. Использую FROM golang:1.22 как базовый образ. Как правильно уменьшить размер и ускорить сборку?
👍 ❤️ 🔥1 😄 🤔
✔ Лучший ответ выбран автором и совпадает с автоматическим подбором — konstantin_app34
Классическое решение — multi-stage build. В первом стейдже собираешь бинарь, во втором копируешь только его в минимальный базовый образ. Вот рабочий шаблон: FROM golang:1.22-alpine AS builder / WORKDIR /app / COPY go.mod go.sum ./ / RUN go mod download / COPY . . / RUN CGO_ENABLED=0 GOOS=linux go build -ldflags='-w -s' -o server . / FROM scratch / COPY --from=builder /app/server / ENTRYPOINT ["/s…
Перейти к ответу →
Аватара пользователя
konstantin_app34
Сообщения: 1
Зарегистрирован: Пт май 22, 2026 11:28 pm

Re: как ускорить запуск Go приложения в Docker уменьшить размер образа

Сообщение konstantin_app34 »

✔ Лучший ответ — выбран автором и совпадает с авто-подбором
Классическое решение — multi-stage build. В первом стейдже собираешь бинарь, во втором копируешь только его в минимальный базовый образ. Вот рабочий шаблон: FROM golang:1.22-alpine AS builder / WORKDIR /app / COPY go.mod go.sum ./ / RUN go mod download / COPY . . / RUN CGO_ENABLED=0 GOOS=linux go build -ldflags='-w -s' -o server . / FROM scratch / COPY --from=builder /app/server / ENTRYPOINT ["/server"]. Образ FROM scratch — буквально пустой, итог будет 10-20MB вместо 800.
👍1 ❤️ 🔥 😄1 🤔
Аватара пользователя
yaroslav_spb
Сообщения: 4
Зарегистрирован: Пн май 11, 2026 4:08 am

Re: как ускорить запуск Go приложения в Docker уменьшить размер образа

Сообщение yaroslav_spb »

Флаги -ldflags='-w -s' важны: -w убирает DWARF debug info, -s убирает symbol table. Вместе дают 30-40% уменьшение размера бинаря. CGO_ENABLED=0 критично для FROM scratch — иначе бинарь динамически слинкован с libc и не запустится в пустом образе.
👍 ❤️1 🔥1 😄1 🤔2
Аватара пользователя
dnscache8196
Сообщения: 32
Зарегистрирован: Вс май 10, 2026 10:26 pm

Re: как ускорить запуск Go приложения в Docker уменьшить размер образа

Сообщение dnscache8196 »

FROM scratch круто, но неудобно если нужны SSL-сертификаты или timezone data. Тогда лучше FROM alpine:3.19 — образ 5MB, есть /etc/ssl/certs и musl libc. Либо используй gcr.io/distroless/static-debian12 от Google — тоже минимальный, но с сертификатами и без shell (что плюс для безопасности).
👍1 ❤️1 🔥1 😄2 🤔
Аватара пользователя
yaroslav_hex13
Сообщения: 20
Зарегистрирован: Пн май 11, 2026 8:32 am

Re: как ускорить запуск Go приложения в Docker уменьшить размер образа

Сообщение yaroslav_hex13 »

Для ускорения самой сборки в CI — кешируй слои правильно. Копируй go.mod и go.sum отдельно до COPY . . и запускай go mod download до копирования исходников. Тогда зависимости кешируются в отдельном слое и не перекачиваются при изменении кода. Это самое частое упущение — люди делают COPY . . / RUN go mod download и теряют весь кеш при любом изменении файла.
👍1 ❤️ 🔥 😄1 🤔
Аватара пользователя
misha_sec
Сообщения: 1
Зарегистрирован: Пн май 11, 2026 1:44 am

Re: как ускорить запуск Go приложения в Docker уменьшить размер образа

Сообщение misha_sec »

Ещё совет: используй .dockerignore. Без него COPY . . затягивает .git, vendor если есть, тесты, документацию — всё это идёт в build context и раздувает время отправки в демон. Минимальный .dockerignore: .git, .gitignore, *.md, *_test.go, Dockerfile.
👍4 ❤️ 🔥1 😄1 🤔3
Аватара пользователя
denis6377
Сообщения: 14
Зарегистрирован: Ср май 13, 2026 1:35 am

Re: как ускорить запуск Go приложения в Docker уменьшить размер образа

Сообщение denis6377 »

Проверить итоговый размер слоёв удобно через docker image inspect или docker history --no-trunc image:tag. Ещё есть утилита dive — визуально показывает что в каждом слое занимает место. Очень помогает найти случайно затянутые тестовые данные или логи сборки.
👍3 ❤️ 🔥 😄 🤔
Ответить
Поделиться темой: ✈ Telegram VK

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость