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

Why doesn't the cron service in Dockerfile run?

虽然 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 设置 cron :-)

PPS:
完成 Docker 文件(已更新):

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

Cron 不是 运行 因为只有最后一个 CMD 会覆盖第一个(正如@xuhdev 所说)。它记录在这里:https://docs.docker.com/reference/builder/#cmd.

There can only be one CMD instruction in a Dockerfile. If you list more than one CMD then only the last CMD will take effect.

如果你想在同一个容器中包含 nginxcron 运行,你需要使用某种主管(比如 supervisord 或其他)那将是容器的 pid 1 进程并管理子进程。我认为这个项目应该有所帮助:https://github.com/nbraquart/docker-nginx-php5-cron(它似乎可以实现您想要实现的目标)。

根据您的 cron 的用途,还有其他解决方案 — 例如为每个提交或每个标签构建一个新图像等...

与 supervisor 一起启动 cron,你的 cron 作业应该被执行。以下是您可以采取的故障排除步骤,以确保 cron 运行ning

  1. cron 守护进程运行是否在容器中?登录容器并 运行 ps a | grep cron 查找。使用docker exec -ti CONTAINERID /bin/bash登录容器。

  2. supervisord是运行ning吗?

  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

这些只是您可以遵循的一些故障排除提示。

我已经在 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

就我而言,事实证明我需要 运行 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