ksaitoの日記

日々試したことの覚え書き

docker runすると/bin/bash: /bin/bash: cannot execute binary fileが出る場合の対処

コンテナのデバッグで下記のコマンドをよく使います。

$ docker run -it --rm <イメージ> /bin/sh

zabbixのオフシャルイメージの幾つかで下記のようなエラーがでてしばらく悩みました。

$ docker run -it --rm zabbix/zabbix-agent:alpine-3.2-latest /bin/sh
/bin/sh: /bin/sh: cannot execute binary file
$

次のように実行することでエラーを回避出来ます。

$ docker run -it --rm zabbix/zabbix-agent:alpine-3.2-latest -i
bash-4.3#

原因と再現手順

オフシャルイメージのDockerfileを見ると、ENTRYPOINTCMDは、下記のように書かれています。

$ tail -3 Dockerfile
ENTRYPOINT ["/bin/bash"]

CMD ["/run_zabbix_component.sh", "agentd", "none"]
$

5. CMD and ENTRYPOINT better togetherENTRYPOINTCMDを併用することでコンテナ化したバイナリのアプリケーションをENTRYPOINTに指定して、CMDにデフォルトの振る舞いに必要なオプションを指定するというベストプラクティスが紹介されています。

今回のケースでは、ENTRYPOINT/bin/bashが指定されていることで引数に指定した/bin/bashシェルスクリプトと想定して実行しようとしたためにエラーとなりました。

再現してみると下記のようなことが発生していることになります。-iオプションは、bashの対話的な起動オプションでCMDに指定されたシェルを無効にするためのワークアラウンドです。

$ docker run -it --rm zabbix/zabbix-agent:alpine-3.2-latest /bin/bash
/bin/bash: /bin/bash: cannot execute binary file
$ docker run -it --rm zabbix/zabbix-agent:alpine-3.2-latest -i
bash-4.3# /bin/bash /bin/bash
/bin/bash: /bin/bash: cannot execute binary file
bash-4.3#

ENTRYPOINTにシェル以外のバイナリが指定されているコンテナの場合は、下記のような別解で対応します。

$ docker run --entrypoint /bin/sh -it --rm zabbix/zabbix-agent:alpine-3.2-latest
/var/lib/zabbix #

これで、Dockerfileの設定にかかわらず内容を確認できるようになりました。