Флаги, необходимые для создания файлов * stati c в golang - PullRequest
0 голосов
/ 20 апреля 2020

Я строил образ 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? (т.е. бинарные файлы, которые абсолютно не нуждаются в терминах библиотек из сред, в которых они будут работать?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Непосредственно перед тем, как мы начнем, один из рассказов Расса Кокса: Комментарий

Прочитайте также: Комментарий

Да, я согласен с комментарием Фолькера о том, что некоторые системы на самом деле не допускают stati c бинарных файлов.

Читать дальше: Компилировать пакеты и зависимости

-a
    force rebuilding of packages that are already up-to-date.

-ldflags '[pattern=]arg list'
    arguments to pass on each go tool link invocation.

Читать: go ссылка на инструмент

-extldflags flags
    Set space-separated flags to pass to the external linker.

Следовательно, он пытается перестроить все пакеты (также зависимости) с отключенным CGO, а также -static означает, что не связывается с общим библиотеки.

Некоторые моменты, связанные со связыванием stati c, хорошо объяснены: Связывание golang статически

0 голосов
/ 20 апреля 2020

Как объяснено здесь , -ldflags передает параметры компоновщику go tool, и в этом случае -extldflags "-static" указывает компоновщику не ссылаться с помощью внешнего компоновщика.

CGO_ENABLED=0 означает отключение CGO (очевидно), поскольку вам чаще всего не требуется CGO, а также это удаляет зависимости кросс-компилятора.

Оба эти 2 флага только намереваются:

  1. Уменьшить двоичную копию на дополнительный уровень.

  2. Удалить зависимости от внешней библиотеки.


Исправьте меня, если я сообщу о любых неточностях.

...