为什么Dockerfile中的cron服务不运行?

时间:2015-05-23 20:18:49

标签: cron docker dockerfile

对于此问题searching,我发现: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设置crons: - )

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

5 个答案:

答案 0 :(得分:8)

Cron没有运行,因为只有最后一个CMD覆盖了第一个(如@xuhdev所说)。它在此处记录:https://docs.docker.com/reference/builder/#cmd

  

Dockerfile中只能有一条CMD指令。如果列出多个CMD,则只有最后一个CMD才会生效。

如果您希望nginxcron在同一个容器中运行,则需要使用某种类型的主管(如supervisord或其他人) > pid 1 您的容器进程并管理chield进程。我认为这个项目应该有所帮助:https://github.com/nbraquart/docker-nginx-php5-cron(它似乎做了你想要实现的目标)。

根据您的cron所针对的内容,还有其他解决方案 - 例如为每个提交或每个标签构建新图像等等。

答案 1 :(得分:7)

Having started crond with supervisor, your cron jobs should be executed. Here are the troubleshooting steps you can take to make sure cron is running

  1. Is the cron daemon running in the container? Login to the container and run ps a | grep cron to find out. Use docker exec -ti CONTAINERID /bin/bash to login to the container.

  2. Is supervisord running?

  3. In my setup for instance, the following supervisor configuration works without a problem. The image is ubuntu:14.04. I have CMD ["/usr/bin/supervisord"] in the Dockerfile.
[supervisord]
 nodaemon=true
[program:crond]
 command = /usr/sbin/cron
 user = root
 autostart = true
  1. Try another simple cron job to findout whether the problem is your cron entry or the cron daemon. Add this when logged in to the container with crontab -e :

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

  2. Check the container logs for any further information on cron:

    docker logs CONTAINERID | grep -i cron

These are just a few troubleshooting tips you can follow.

答案 2 :(得分:1)

我在CentOS上使用它并且它可以工作:

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

我的Dockerfile的其余部分只是yum安装cronie并触及/var/log/cron文件,因此当CMD运行时它将存在。

答案 3 :(得分:0)

在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

答案 4 :(得分:0)

就我而言,事实证明我需要在运行时运行cron start。我无法将其放置在Dockerfile或docker-compose.yml中,因此最终将其放置在用于部署的Makefile中。

类似的东西:

task-name:
     @ docker-compose down && docker-compose build && docker-compose up -d
     docker exec CONTAINERNAME /bin/bash -c cron start