uWSGI と cron を同時に Docker で動かすときのコマンドの順番

March 11, 2018, 6:54 a.m. edited Sept. 15, 2018, 4:51 p.m.

#Docker 

$$ \def\bra#1{\mathinner{\left\langle{#1}\right|}} \def\ket#1{\mathinner{\left|{#1}\right\rangle}} \def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}} $$

Django などを uWSGI で動かす Docker コンテナでは docker-compose.yml に,

command: /usr/local/bin/uwsgi --ini /app/uwsgi.ini --touch-reload=/app/uwsgi.ini

と書くが(これにより touch uwsgi.ini とすることでアプリケーションを再読み込みできる),このコンテナで同時に cron を動かしたいときがある.その場合は,Dockerfile で

RUN apt-get install -y cron  # 今回は Debian GNU/Linux 系を想定
RUN echo "0 3 * * * bash -l hoge.sh" > /etc/cron.d/hoge

のようにした上で,uWSGI と cron を同時に実行するようなコマンドを実行する必要がある.とはいっても supervisor などは必要なく,

command: /bin/bash -c "/usr/sbin/cron && /usr/local/bin/uwsgi --ini /app/uwsgi.ini --touch-reload=/app/uwsgi.ini"

でよい.ここで逆に,

command: /bin/bash -c "/usr/local/bin/uwsgi --ini /app/uwsgi.ini --touch-reload=/app/uwsgi.ini && /usr/sbin/cron"

と書いてしまうと

# /etc/init.d/cron status
 * cron is not running

と怒られてしまう(これのせいで悩んだ).おそらく,前者の uwsgi コマンドが終了しないために後者のコマンドがいつまでも実行されないためであろう.