Я строил образ Docker, используя scratch
в качестве базы.
Следующая команда сборки:
RUN go build -o /go/bin/myapp
создала двоичный файл, который продолжал давать сбой при выполнении:
standard_init_linux.go:211: exec user process caused "no such file or directory"
Методом проб и ошибок я обнаружил, что мне нужно построить следующее:
RUN CGO_ENABLED=0 go build -o /go/bin/myapp -a -ldflags '-extldflags "-static"' .
Почему необходимы CGO_ENABLED=0
и -ldflags '-extldflags "-static"'
?
Разве оба варианта не создают стандартные файлы c? (т.е. бинарные файлы, которые абсолютно не нуждаются в терминах библиотек из сред, в которых они будут работать?