状況
GoのプログラムをDockerのマルチステージビルドを利用してビルドして,バイナリ実行用のイメージを作成することを考える.この時,バイナリ実行用のコンテナイメージのベースとしてAlpineを指定し,そのイメージをdocker run
した際に次のようなエラーが出た.
standard_init_linux.go:211: exec user process caused "no such file or directory"
解決法
Goをビルドする際にCGO_ENABLED=0
フラグをつける.
詳細
正直言うとなぜこれで解決するのかはよく分からない*1が,おそらく次のようなことが起こっているのだと思う.ちなみに適当言ってる可能性がある.
- プログラムの依存パッケージが特定の共有オブジェクトを要求する
- cgoが有効ならその共有オブジェクトをビルド用のコンテナでビルドし,動的にリンクする
- そのオブジェクトはバイナリ実行用コンテナイメージのベースであるalpineに含まれてない
- cgoが無効になっていても別の方法でビルドできる(静的なリンクを行なっている?)
- よって,cgoを無効にしてビルドすると実行できる
*1:ソースを発見できなかった,もうちょっと頑張れば見つかるのかもしれない