コンテナでよく出るエラーの対処方法です。
よく出るエラー
コンテナのデバッグで下記のコマンドをよく使います。
$ 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を見ると、ENTRYPOINTとCMDは、下記のように書かれています。
$ tail -3 Dockerfile
ENTRYPOINT ["/bin/bash"]
CMD ["/run_zabbix_component.sh", "agentd", "none"]
$
5. CMD and ENTRYPOINT better togetherにENTRYPOINTとCMDを併用することでコンテナ化したバイナリのアプリケーションを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の設定にかかわらず内容を確認できるようになりました。