コンテナのデバッグで下記のコマンドをよく使います。
$ 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の設定にかかわらず内容を確認できるようになりました。