Dockerコンテナ上でsupervisorctlが上手く動作しないことがある

はじめに

 Dockerコンテナ上で使用するプロセス制御ソフトと言えば、私にとってはSupervisorなのですが、supervisorctlがうまく機能しなくて困ったのでメモ。

環境

  • ホスト側
    • CoreOS 647.0.0
    • Docker 1.5.0
  • コンテナ側
    • Ubuntu 14.04.2
    • Supervisor 3.0b2

supervisorctlがうまく機能しないパターン

 根本原因はわかっていないのですが、以下のようにUNIXドメインソケットを使うようにSupervisor構成すると、supervisorctlがエラーを出力することがあります。

supervisorctlがエラーを出力するDockerfileの記述例
FROM ubuntu:14.04

EXPOSE 80

RUN apt-get update && apt-get install -y --force-yes supervisor apache2 && rm -rf /var/lib/apt/lists/*

RUN mkdir /var/lock/apache2 && mkdir /var/run/apache2/

RUN touch /etc/supervisord.conf \
&& echo '[unix_http_server]'  >> /etc/supervisord.conf \
&& echo 'file=/tmp/supervisor.sock'  >> /etc/supervisord.conf \
&& echo '[supervisord]'  >> /etc/supervisord.conf \
&& echo 'nodaemon=true'  >> /etc/supervisord.conf \
&& echo '[supervisorctl]'  >> /etc/supervisord.conf \
&& echo 'serverurl=unix:///tmp/supervisor.sock'  >> /etc/supervisord.conf \
&& echo '[program:apache2]'  >> /etc/supervisord.conf \
&& echo 'environment=APACHE_LOG_DIR="/var/log/apache2",APACHE_LOCK_DIR="/var/lock/apache2", APACHE_RUN_USER="www-data", APACHE_RUN_GROUP="www-data", APACHE_PID_FILE="/var/run/apache2/apache", APACHE_RUN_DIR="/var/run/apache2"'  >> /etc/supervisord.conf \
&& echo 'command=/usr/sbin/apache2 -DFOREGROUND'  >> /etc/supervisord.conf \
&& echo 'redirect_stderr=true'  >> /etc/supervisord.conf

CMD /usr/bin/supervisord -c /etc/supervisord.conf
supervisorctlが出力するエラー
core@core-01 ~/work_supervisor30b2_apache $ docker run -d --name supervisor30b2_apache  supervisor30b2_apache
50b75fdaf02614fd83c7fa228e03c24d2a4aaf3028fb0de56bde25e251923dd9
core@core-01 ~/work_supervisor30b2_apache $ docker exec -it supervisor30b2_apache bash
root@50b75fdaf026:/# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   4448   780 ?        Ss   03:30   0:00 /bin/sh -c /usr/bin/supervisord -c /etc/supervisord.conf
root        13  0.3  1.6  52096 16384 ?        S    03:30   0:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root        16  0.0  0.4  71308  4948 ?        S    03:30   0:00 /usr/sbin/apache2 -DFOREGROUND
www-data    17  0.0  0.5 360472  6028 ?        Sl   03:30   0:00 /usr/sbin/apache2 -DFOREGROUND
www-data    18  0.0  0.5 360472  6028 ?        Sl   03:30   0:00 /usr/sbin/apache2 -DFOREGROUND
root        73  0.0  0.3  18144  3292 ?        S    03:30   0:00 bash
root        94  0.0  0.2  15572  2144 ?        R+   03:30   0:00 ps aux
root@50b75fdaf026:/# supervisorctl -c /etc/supervisord.conf status
unix:///tmp/supervisor.sock refused connection

 

 環境によっては、以下のエラーが出力されることもあります。

unix:///tmp/supervisor.sock no such file

supervisorctlがうまく機能するパターン

 以下のようにINETドメインソケットを使うようにSupervisor構成すると、supervisorctlが正常に機能します。

supervisorctlがうまく機能するDockerfileの記述例
FROM ubuntu:14.04

EXPOSE 80

RUN apt-get update && apt-get install -y --force-yes supervisor apache2 && rm -rf /var/lib/apt/lists/*

RUN mkdir /var/lock/apache2 && mkdir /var/run/apache2/

RUN touch /etc/supervisord.conf \
&& echo '[inet_http_server]'  >> /etc/supervisord.conf \
&& echo 'port=127.0.0.1:9001'  >> /etc/supervisord.conf \
&& echo '[supervisord]'  >> /etc/supervisord.conf \
&& echo 'nodaemon=true'  >> /etc/supervisord.conf \
&& echo '[rpcinterface:supervisor]'  >> /etc/supervisord.conf \
&& echo 'supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface'  >> /etc/supervisord.conf \
&& echo '[supervisorctl]'  >> /etc/supervisord.conf \
&& echo 'serverurl=http://127.0.0.1:9001'  >> /etc/supervisord.conf \
&& echo '[program:apache2]'  >> /etc/supervisord.conf \
&& echo 'environment=APACHE_LOG_DIR="/var/log/apache2",APACHE_LOCK_DIR="/var/lock/apache2", APACHE_RUN_USER="www-data", APACHE_RUN_GROUP="www-data", APACHE_PID_FILE="/var/run/apache2/apache", APACHE_RUN_DIR="/var/run/apache2"'  >> /etc/supervisord.conf \
&& echo 'command=/usr/sbin/apache2 -DFOREGROUND'  >> /etc/supervisord.conf \
&& echo 'redirect_stderr=true'  >> /etc/supervisord.conf

CMD /usr/bin/supervisord -c /etc/supervisord.conf
supervisorctlの出力
core@core-01 ~/work_supervisor30b2_apache $ docker run -d --name supervisor30b2_apache  supervisor30b2_apache
10e4d6769a88e758b34534e8b78013ac9dde62511ce23eea23c7f9a6ff202e3b
core@core-01 ~/work_supervisor30b2_apache $ docker exec -it supervisor30b2_apache bash
root@10e4d6769a88:/# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   4448   680 ?        Ss   04:45   0:00 /bin/sh -c /usr/bin/supervisord -c /etc/supervisord.conf
root        13  0.1  1.6  54196 16580 ?        S    04:45   0:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root        16  0.0  0.4  71308  4824 ?        S    04:45   0:00 /usr/sbin/apache2 -DFOREGROUND
www-data    17  0.0  0.5 360472  6112 ?        Sl   04:45   0:00 /usr/sbin/apache2 -DFOREGROUND
www-data    18  0.0  0.5 360472  6112 ?        Sl   04:45   0:00 /usr/sbin/apache2 -DFOREGROUND
root        73  0.0  0.3  18144  3136 ?        S    04:46   0:00 bash
root        90  0.0  0.2  15572  2172 ?        R+   04:46   0:00 ps aux
root@10e4d6769a88:/# supervisorctl status
apache2                          RUNNING    pid 16, uptime 0:00:49

さいごに

 まあ、動いたので原因についてはあまり考えすぎないようにします…。