検索 この問題について、私は次のことを発見しました: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
スーパーバイザーでcrondを開始したら、cronジョブを実行する必要があります。 cronが実行されていることを確認するために実行できるトラブルシューティング手順は次のとおりです。
Cronデーモンはコンテナで実行されていますか?コンテナにログインし、ps a | grep cron
を実行して調べます。 docker exec -ti CONTAINERID /bin/bash
を使用してコンテナにログインします。
監視対象は実行されていますか?
ubuntu:14.04
です。 DockerfileにCMD ["/usr/bin/supervisord"]
があります。[supervisord]
nodaemon=true
[program:crond]
command = /usr/sbin/cron
user = root
autostart = true
別の簡単なcronジョブを試して、問題がcronエントリなのかcronデーモンなのかを調べてください。 crontab -e
でコンテナにログインしたときにこれを追加します:
* * * * * echo "hi there" >> /tmp/test
Cronの詳細については、コンテナログを確認してください。
docker logs CONTAINERID | grep -i cron
これらは、従うことができるトラブルシューティングのヒントのほんの一部です。
(@xuhdevが言ったように)最後のCMD
だけが最初のものをオーバーライドするため、cronは実行されていません。ここに文書化されています: https://docs.docker.com/reference/builder/#cmd 。
Dockerfileには1つのCMD命令しか存在できません。複数のCMDをリストすると、最後のCMDのみが有効になります。
nginx
とcron
を同じコンテナで実行したい場合は、-になる何らかのスーパーバイザ(supervisord
など)を使用する必要があります。 pid 1コンテナのプロセスであり、chieldプロセスを管理します。このプロジェクトは役立つはずだと思います: https://github.com/nbraquart/docker-nginx-php5-cron (それはあなたが達成しようとしていることをしているようです)。
Cronの目的に応じて、他の解決策があります。たとえば、コミットごとまたはタグごとに新しいイメージを作成するなどです。
私はこれをCentOSで使用しましたが、機能します。
CMD service crond start ; tail -f /var/log/cron
Dockerfileの残りの部分は、yumがcronieをインストールし、/var/log/cron
ファイルにアクセスするだけなので、CMDの実行時にそこにあります。
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にログを記録するためのものです