repl.info

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系のイメージを基本的に使うようにするかなー。