Перейти к содержимому
6 / 15

Статическая линковка и почему бинарник не запускается в scratch

Статический бинарник Go не требует ничего от системы — в этом и смысл образа scratch, который вообще пуст. Но «ничего» на практике оказывается неправдой, и сервис падает по четырём типовым причинам. Динамическая линковка из-за CGO — самая частая: файл требует libc, которой в scratch нет. Отсутствие корневых сертификатов: любой запрос по HTTPS падает с ошибкой проверки сертификата, потому что /etc/ssl/certs пуст. Отсутствие данных о часовых поясах: time.LoadLocation("Europe/Tbilisi") не находит базу; лечится либо копированием /usr/share/zoneinfo, либо импортом time/tzdata, встраивающим её в бинарник. Отсутствие пользователя: контейнер запускается от root, а /etc/passwd пуст, и приложение, которому нужен непривилегированный пользователь, не может его найти. Практический ответ — не scratch, а distroless/static: там уже есть сертификаты, часовые пояса и непривилегированный пользователь.

Статическая линковка и почему бинарник не запускается в scratch | JScriptiser