CentOSでSupervisorを使う

変なリモートホストでDockerを動かしていると、結局SSHで入るしかないといった状況になったりする。そういうわけでコンテナ内で複数のプロセスを動かすツールの紹介である。以下の通り本家でもきっちり紹介されているSupervisorだ。
docs.docker.com

CentOS自体にはSupervisorは入っていない為、epelを事前に入れてやる必要がある*1。そうすると次のようなDockerfileになる*2

FROM centos

RUN yum update install -y openssh-server epel-release && \
    yum install nginx supervisor && \
    yum clean all && \
    echo 'root:screencast' | chpasswd && \
    sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config && \
    ssh-keygen -t rsa -N '' -f /etc/ssh/ssh_host_rsa_key

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf


EXPOSE 22 80
CMD ["/usr/bin/supervisord"]

supervisord.confも次の通りである。

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

[program:nginx]
command=/usr/sbin/nginx -g 'daemon off;'

所が、これを掲題の通りCentOSで動かしてみるとうまくいかない。RHEL系の/etc構成が何となく分かる人には分かるだろうが、次がおかしい。

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

/etc/supervisor/conf.d はCentOSではSupervisorの設定ファイル用のディレクトリではない。実際は /etc 直下に置けばよい。またはSupervisorのインストール時に生成されるデフォルトの設定ファイル /etc/supervisord.conf で /etc/supervisord.d/*.ini を読む事になっているので、それに合わせてもよい。今回は後者を取る。次が完成版だ。

FROM centos

RUN yum update install -y openssh-server epel-release && \
    yum install nginx supervisor && \
    yum clean all && \
    echo 'root:screencast' | chpasswd && \
    sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config && \
    ssh-keygen -t rsa -N '' -f /etc/ssh/ssh_host_rsa_key

COPY supervisord.ini /etc/supervisord.d/supervisord.ini


EXPOSE 22 80
CMD ["/usr/bin/supervisord"]

iniファイルは先に上げたものの拡張子を変えるだけで済む。

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

[program:nginx]
command=/usr/sbin/nginx -g 'daemon off;'

これでCentOSベースのコンテナでもSupervisorが使えるようになった。多分RHEL系は大体同じなんじゃないかな。またDockerのバッドノウハウを学んでしまったような気がする。

*1:pipを入れてPyPIから持ってくる手もあるが、かえってイメージが大きくなってしまう

*2:Nginxにしている深い意味はない