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
さいごに
まあ、動いたので原因についてはあまり考えすぎないようにします…。