全力で怠けたい

怠けるために全力を尽くしたいブログ。

`go build` した Go のバイナリを実行すると「/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found`」を出力して止まるときにやったこと。

go build した Go のバイナリを実行すると次のメッセージを出力して止まるときにやったことのメモ。

/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found`

「/lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32' not found」を出力して止まる

やったこと

go build した Go のバイナリを Docker イメージに入れて実行すると「/lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32' not found」を出力して止まってしまうようだった。 Docker のベースイメージは distroless の debian を使っているのだけど Docker イメージに入れてる Go のバイナリを go build したマシン (Arch Linux) で実行するとちゃんと動くので、おそらく go build するときの設定がよろしくない可能性が高そう。

結論

go build した Go のバイナリを実行すると出力するメッセージでググったら一発だった。

right, you ran into this issue because your build machine (arch) is running newer glibc compared to your deployment host ( ubuntu ), usually, if it was otherway around it would have worked without any issues.

go build するマシンの glibc のバージョンが go build した Go バイナリを動かすマシンの glibc のバージョンより新しいとこの事象が発生するようなので go build するマシンの glibc のバージョンを下げるか go build した Go バイナリを動かすマシンの glibc のバージョンを上げるかしたら事象は解消しそう。 ただ glibc のバージョンを変えると影響が非常に大きくなると思うので go build するマシンの glibc のバージョンはおいそれと上げられないし go build した Go バイナリを動かすマシンの glibc のバージョンを上げるのも少し手間がかかりそう。

結論としては go build するときに CGO_ENABLED=0 のように指定して cgo を無効にして Go バイナリをビルドすればいい。

CGO_ENABLED=0 go build みたいな感じでビルドした Go のバイナリを Docker イメージに入れて実行すると前述の /lib/x86_64-linux-gnu/libc.so.6: version 〜 not found のメッセージが出なくなった。よさそう。

参考サイト