1つのDockerコンテナで複数のプロセスを起動する
1つのDockerコンテナで,webサーバーを動かしながらcronも起動する,みたいなことをしたい.
ここではプロセス管理ツールSupervisorを利用して,1つのコンテナで複数のプロセスを起動する. 例として,nginxで静的ファイル配信を行いながらcronで配信ファイルの内容を定期的に書き換えてみる.
ファイルは次のような感じ:
code:ファイル
.
├── default.conf
├── Dockerfile
└── supervisord.conf
nginxで配信するファイル/static/date.txtをcronで1分毎に書き換える:
code:Dockerfile
FROM nginx:alpine
RUN apk update && apk add --no-cache supervisor
COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY ./supervisord.conf /etc/supervisord.conf
RUN mkdir /static && \
date > /static/date.txt && \
echo "*/1 * * * * date > /static/date.txt" > /etc/crontabs/root
EXPOSE 80
nginxの設定:
code:default.conf
server {
listen 80;
server_name _;
location / {
root /static;
try_files date.txt =404;
}
}
supervisorの設定.ログは標準出力へ:
code:supervisord.conf
nodaemon=true
command=nginx -g "daemon off;"
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
command=crond -f -L 15
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
dockerはforegroundでプロセスが動いていないと停止してしまうのでnodaemon=trueは必須.
これでビルドしたイメージを起動するとnginxとcronが起動している.
nginxへアクセスすると1分毎に内容が変わるのが確認できる.