変なリモートホストで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のバッドノウハウを学んでしまったような気がする。