Cron和Crontab文件不在Docker中执行

我有这个简单的Dockerfile进行testing,但是在PHP映像的LEMP堆栈中也是这样:cron作业根本不在Docker中执行。

这是我的testingDockerfile:

FROM debian:latest MAINTAINER XY <info@domain.com> LABEL Description="Cron" Vendor="Istvan Lantos" Version="1.0" RUN apt-get -y update && apt-get -y dist-upgrade \ && apt-get -y install \ cron \ rsyslog \ vim RUN rm -rf /var/lib/apt/lists/* #cron fixes RUN touch /etc/crontab /etc/cron.d/* /var/spool/cron/crontabs/* #COPY etc/cron.d /etc/cron.d COPY etc/crontab /etc/crontab #COPY var/spool/cron/crontabs /var/spool/cron/crontabs RUN chmod 600 /etc/crontab /etc/cron.d/* /var/spool/cron/crontabs/* RUN touch /etc/crontab /etc/cron.d/* /var/spool/cron/crontabs/* RUN rm -rf /var/lib/apt/lists/* COPY docker-entrypoint.sh / RUN chmod +x /docker-entrypoint.sh CMD ["/docker-entrypoint.sh"] 

docker-entrypoint.sh:

 #!/bin/bash set -e echo PID1 > /dev/null /etc/init.d/rsyslog start #Stay in foreground mode, don't daemonize. /usr/sbin/cron -f 

这是Crontab文件。 我还在/etc/cron.d/var/spool/cron/crontabs放置了一个用户名,但是效果和我修改这个基本的crontab文件一样:cron jobs not be executed :

 MAILTO="" # /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh #PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/php7/bin:/usr/local/php7/sbin # mh dom mon dow user command #17 * * * * root cd / && run-parts --report /etc/cron.hourly #25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) #47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) #52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) # */1 * * * * root date >> /var/log/cron-test.log 2>&1 

这是/var/log/syslog文件的输出:

 Jan 23 09:38:39 1ab854e8d9a7 rsyslogd: [origin software="rsyslogd" swVersion="8.4.2" x-pid="14" x-info="http://www.rsyslog.com"] start Jan 23 09:38:39 1ab854e8d9a7 rsyslogd: imklog: cannot open kernel log(/proc/kmsg): Operation not permitted. Jan 23 09:38:39 1ab854e8d9a7 rsyslogd-2145: activation of module imklog failed [try http://www.rsyslog.com/e/2145 ] Jan 23 09:38:39 1ab854e8d9a7 cron[19]: (CRON) INFO (pidfile fd = 3) Jan 23 09:38:39 1ab854e8d9a7 cron[19]: (*system*) NUMBER OF HARD LINKS > 1 (/etc/crontab) Jan 23 09:38:39 1ab854e8d9a7 cron[19]: (*) ORPHAN (no passwd entry) Jan 23 09:38:39 1ab854e8d9a7 cron[19]: (CRON) INFO (Running @reboot jobs) 

/var/log/cron-test.log不会被cron作业创build。

我有一个问题,标志着这个“脱离主题”和超级用户的材料,再加上这是关于通用计算硬件和软件:真的吗? Docker的问题,当成为系统pipe理员的东西? 这样每个Docker相关的问题都至less有一个标志。 我并不反对将更多的用户推荐到不太知名的子站点,但我们在这里得到的答案比他们更多。

更新:

这是我所提出的,直到cron工作不工作:

Dockerfile结束:

 COPY cron-jobs.sh / RUN chmod +x /cron-jobs.sh COPY docker-entrypoint.sh / RUN chmod +x /docker-entrypoint.sh CMD ["/docker-entrypoint.sh"] 

docker-entrypoint.sh:

 #!/bin/bash set -e echo PID1 > /dev/null # Run script in the background (this is not daemonized) /cron-jobs.sh & /usr/local/php7/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php7/etc/php-fpm.conf 

cron-jobs.sh:

 #!/bin/bash while true; do date >> /var/log/cron-test.log 2>&1 sleep 60 done 

Cron(至less在Debian中)不会执行超过1个硬链接的crontabs,请参阅错误647193 。 由于Docker使用覆盖,所以会有多个链接到文件,因此您必须在启动脚本中touch它,以便链接被切断:

 touch /etc/crontab /etc/cron.*/*