TL; DR
- webサーバー等netパッケージを使っているバイナリを
go installする場合はCGO_ENABLED=0をつける- 付けないと
no such file or directoryと出てしまう - netパッケージをimportしたバイナリはダイナミックリンクでビルドされてしまうのが原因
- 付けないと
はじめに
gRPC UI 1のバイナリをマルチステージビルドしたら、no such file or directory と出て実行できませんでした。
$ docker build .
Sending build context to Docker daemon 9.216kB
...
Successfully built 53b474247144
$ docker run -it --rm 53b474247144
exec ./grpcui: no such file or directory
原因
goのバイナリは通常スタティックリンクで生成されますが、netパッケージを使う場合のみダイナミックリンクでビルドされてしまうのが原因でした。
(ダイナミックリンクなのでscratchイメージに持っていくと実行時にライブラリが無くて動かなくなってしまいます)
CGO_ENABLED=0 でC非依存のスタティックリンクリンクを作成すれば、scratchでも動くようになりました。
FROM golang AS builder
ARG CGO_ENABLED=0
RUN go install github.com/fullstorydev/grpcui/cmd/grpcui@latest
#...
参考にさせていただいた記事
-
gRPC UIは、UI上で手軽にgRPCリクエストを送れるwebアプリ(イメージはSwaggerのgRPC版?)です。 ↩