web-dev-qa-db-ja.com

Dockerfileのcronサービスが実行されないのはなぜですか?

検索 この問題について、私は次のことを発見しました:cron -fサービスを開始する必要があります。

ので、私は持っています:
RUN apt-get install -qq -y git cron

次に私は持っています:
CMD cron -f && crontab -l > pullCron && echo "* * * * * git -C ${HOMEDIR} pull" >> pullCron && crontab pullCron && rm pullCron

Dockerfileはエラーなしでデプロイされますが、cronが実行されません。行を追加してcronサービスを開始するにはどうすればよいですか?

PS:
cronのgit関数は実際にはフックでなければならないことは知っていますが、私にとって(そしておそらく他の人にとって)これはDockerでcronを設定する方法を学ぶことです:-)

PPS:
完全なDockerfile(更新):

RUN apt-get update && apt-get upgrade -y
RUN mkdir -p /var/log/supervisor
RUN apt-get install -qq -y nginx git supervisor cron wget
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN wget -O ./supervisord.conf https://raw.githubusercontent.com/..../supervisord.conf
RUN mv ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN apt-get install software-properties-common -y && apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449 && add-apt-repository 'deb http://dl.hhvm.com/ubuntu utopic main' && apt-get update && apt-get install hhvm -y
RUN cd ${HOMEDIR} && git clone ${GITDIR} && mv ./tybalt/* ./ && rm -r ./tybalt && git init
RUN echo "* * * * * 'cd ${HOMEDIR} && /usr/bin/git pull Origin master'" >> pullCron && crontab pullCron && rm pullCron
EXPOSE 80
CMD ["/usr/bin/supervisord"]

PPPS:
Supervisord.conf:

[supervisord]
autostart=true
autorestart=true
nodaemon=true

[program:nginx]
command=/usr/sbin/nginx -c /etc/nginx/nginx.conf

[program:cron]
command = cron -f -L 15
autostart=true
autorestart=true
9
Bob van Luijt

スーパーバイザーでcrondを開始したら、cronジョブを実行する必要があります。 cronが実行されていることを確認するために実行できるトラブルシューティング手順は次のとおりです。

  1. Cronデーモンはコンテナで実行されていますか?コンテナにログインし、ps a | grep cronを実行して調べます。 docker exec -ti CONTAINERID /bin/bashを使用してコンテナにログインします。

  2. 監視対象は実行されていますか?

  3. たとえば、私のセットアップでは、次のスーパーバイザー構成は問題なく機能します。画像はubuntu:14.04です。 DockerfileにCMD ["/usr/bin/supervisord"]があります。
[supervisord]
 nodaemon=true
[program:crond]
 command = /usr/sbin/cron
 user = root
 autostart = true
  1. 別の簡単なcronジョブを試して、問題がcronエントリなのかcronデーモンなのかを調べてください。 crontab -eでコンテナにログインしたときにこれを追加します:

    * * * * * echo "hi there" >> /tmp/test

  2. Cronの詳細については、コンテナログを確認してください。

    docker logs CONTAINERID | grep -i cron

これらは、従うことができるトラブルシューティングのヒントのほんの一部です。

7
Daniel t.

(@xuhdevが言ったように)最後のCMDだけが最初のものをオーバーライドするため、cronは実行されていません。ここに文書化されています: https://docs.docker.com/reference/builder/#cmd

Dockerfileには1つのCMD命令しか存在できません。複数のCMDをリストすると、最後のCMDのみが有効になります。

nginxcronを同じコンテナで実行したい場合は、-になる何らかのスーパーバイザ(supervisordなど)を使用する必要があります。 pid 1コンテナのプロセスであり、chieldプロセスを管理します。このプロジェクトは役立つはずだと思います: https://github.com/nbraquart/docker-nginx-php5-cron (それはあなたが達成しようとしていることをしているようです)。

Cronの目的に応じて、他の解決策があります。たとえば、コミットごとまたはタグごとに新しいイメージを作成するなどです。

8

私はこれをCentOSで使用しましたが、機能します。

CMD service crond start ; tail -f /var/log/cron

Dockerfileの残りの部分は、yumがcronieをインストールし、/var/log/cronファイルにアクセスするだけなので、CMDの実行時にそこにあります。

1
MrMackey

CentOS 7では、これは私にとってはうまくいきます

[program:cron]
command=/usr/sbin/crond -n -s
user = root
autostart = true
stderr_logfile=/var/log/cron.err.log
stdout_logfile=/var/log/cron.log

-nはフォアグラウンド用です-sはstdoutおよびstderrにログを記録するためのものです

0
pwaterz