Go製のバイナリをAlpineで動かすと bash: ./xxx: No such file or directory というエラーになる
opaコマンド(OpenPolicyAgent)でポリシーのテストをCIしようとしていたのだけど、なぜかopaコマンドが実行できず2時間程溶かしたので記録する。
CI中、どうみてもopaコマンドはそこにあるのに、記事タイトルのようにエラーになるのである。
bash: ./opa: No such file or directory
CIしているコンテナの中に入ってあれこれ調べるが、opaコマンドはx86-64向けのバイナリで問題なさそう。なぜなのか。
bash-4.4# file ./opa
./opa: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=4e3ed57cf338f1eaa34981ee4efbff30fad17649, not stripped
全然わかんなくて、同僚に助けを求めたところAlpineだと実行に必要なライブラリがなく、 No such file or directory になることがあるらしい。
確かに、Ubuntuでlddした結果と
$ ldd ./opa
linux-vdso.so.1 => (0x00007ffcb7161000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f302e213000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f302dff6000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f302dc2c000)
/lib64/ld-linux-x86-64.so.2 (0x000056417049e000)
alpineでlddした結果が違う。
ldd ./opa
/lib64/ld-linux-x86-64.so.2 (0x7f5bf9acb000)
libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7f5bf9acb000)
libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f5bf9acb000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f5bf9acb000)
ということで、手っ取り早くCIで使うイメージをdebian:stretch-slimに変更することで解決した。Hugoでも同様の問題が起こることがあるらしいので、今後はdebian-slim系のイメージを基本的に使うようにするかなー。