2016-01-23 155 views
3

我有这个简单的Dockerfile用于测试,但这在我的LEMP堆栈中也是一样的PHP图像:cron作业根本不在Docker中执行。Cron和Crontab文件没有在Docker中执行

这是我的测试Dockerfile:

FROM debian:latest 
MAINTAINER XY <[email protected]> 
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作业不被执行:

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 

# m h 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作业创建。

我对那些标记为“脱离主题”和超级用户资料的人有疑问,此外还有关于一般计算的问题硬件和软件:真的吗? Docker成为系统管理员问题时出现问题?这样每个Docker相关的问题都至少有一个标志。我并不反对向不太知名的儿童网站推广更多用户,但我们在这里得到的答案比他们更多。

UPDATE:

这是我想出直到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:

cron-jobs.sh:

#!/bin/bash 

while true; do 
    date >> /var/log/cron-test.log 2>&1 
    sleep 60 
done 
+1

请问我今天早上提到的示例应用在这里? (http://stackoverflow.com/a/34960575/6309) – VonC

+1

你尝试过baseimage-docker吗?它有syslog和cron。 Ubuntu虽然。 –

+0

@VonC我用'* * * * * root echo“Hello world”>> /var/log/cron.log 2>&1'的内容和'#'的空行尝试了这个例子。尽管创建了'cron.log',但在第一个5-7分钟后它没有填充“Hello World”(例如说它应该每隔2分钟回显一次?)。 'syslog'说''(* system * hello-cron)硬链接数目> 1(/etc/cron.d/hello-cron)''。老实说,我很高兴与bash脚本解决方案,但仍然很好知道为什么不工作。如果可能的话,我想坚持使用Debian。 – Lanti

回答

9

Cron(至少在Debian中)不执行超过1个硬链接的crontabs,请参阅bug 647193。由于码头工人使用覆盖,它的结果有超过一个链接到文件,所以你必须touch它在你的启动脚本中,这样的联系被切断:

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