cron作业未在ubuntu上的docker容器内运行

cron作业未在ubuntu上的docker容器内运行,ubuntu,cron,docker,Ubuntu,Cron,Docker,我有一个简单的Dockerfile,如下所示 FROM ubuntu:latest ADD crontab /etc/cron.d/test-cron RUN chmod a+x /etc/cron.d/test-cron RUN touch /var/log/cron.log CMD cron && tail -f /var/log/cron.log 而且crontab文件的内容非常简单 * * * * * root echo "Hello world" >>

我有一个简单的Dockerfile,如下所示

FROM ubuntu:latest

ADD crontab /etc/cron.d/test-cron

RUN chmod a+x /etc/cron.d/test-cron
RUN touch /var/log/cron.log

CMD cron && tail -f /var/log/cron.log
而且
crontab
文件的内容非常简单

* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
# empty line
当我在本地的OSX机器上运行这个程序时(docker机器正在运行),它工作得很好(“Hello world”每分钟都打印到日志文件中)。但是,当我尝试在Ubuntu机器上运行它时,cron作业不会运行(空日志文件)

下面是我用来运行容器的命令

docker build -t crontest .
docker run --name cron crontest
我不知道为什么会这样。我想知道我的Ubuntu盒子是否有问题(时间设置错误?)。我试图重新启动那台机器,但没有效果。我目前确实有其他docker容器在Ubuntu box上运行,而且运行良好

任何关于如何调试/修复此问题的建议都将不胜感激

编辑:

进入容器(
docker exec-it cron/bin/bash
)后,我可以验证cron是否在那里运行:

root@a2ad451af8d9:/# ps -ef | grep cron
root         1     0  0 20:15 ?        00:00:00 /bin/sh -c cron && tail -f /var/log/cron.log
root         6     1  0 20:15 ?        00:00:00 cron
root         7     1  0 20:15 ?        00:00:00 tail -f /var/log/cron.log
root        25    11  0 20:21 ?        00:00:00 grep --color=auto cron

使用
apt get Install rsyslog
在容器内安装rsyslog,并在使用
cron-L15(最大日志记录)启动cron之前,使用命令
rsyslogd
启动它。然后观察容器中的文件
/var/log/syslog
,查看cron守护进程自己的日志输出。它将告诉您在解析crontab时是否有问题,在您的情况下,如果它已注册并正在尝试运行您的作业,它将每分钟记录一个条目,类似于下面的内容


CRON[16]:(root)CMD(echo“Hello world”>>/var/log/CRON.log 2>&1)

我也有类似的问题,特别是Ubuntu 14.04。为了调试,我尝试在前台运行cron,发现它在尝试运行计划的作业时发出
系统错误
消息


显然,这是
--net=host
参数(ref:)的一个已知问题。我试着按照建议传递
--pid=host
,然后cron作业开始正常运行。

我有一个名为
backup.sh
的备份脚本,我将它复制到
/etc/cron.daily
。 脚本调用不正确

为了实现这一目标,我不得不将其重命名为只备份
而不备份
.sh

因此,对于我来说,
ls-l/etc/cron.daily
有以下输出:

root@0989a35b8f94:/# ls -l /etc/cron.daily
total 24
-rwxr-xr-x 1 root root 1474 Sep 13 16:47 apt-compat
-rwxrwxr-x 1 root root   45 Nov  9 11:18 dobackup
-rwxr-xr-x 1 root root 1597 Feb 22  2017 dpkg
-rwxr-xr-x 1 root root 4125 Mar  2  2016 exim4-base
-rwxr-xr-x 1 root root  249 May 17 11:59 passwd

为了测试/分析这一点,我采用了以下方法:

我查找了crontab文件
cat/etc/crontab
,其中显示了日常crontab作业的以下行:

25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
然后,我将备份脚本隔离到一个专用文件夹中:

mkdir /etc/cron.test
mv /etc/cron.daily/dobackup /etc/cron.test
然后通过跑步

test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.test)
在另一个终端上使用
ps auxf
显示作业现在正在运行。您还可以验证它在重命名为
.sh
版本时是否中断:

mv /etc/cron.test/dobackup /etc/cron.test/dobackup.sh
test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.test)

然后它立即存在,因此没有作业运行。

在我的例子中,当我复制文件时,它创建了一个辅助硬链接(可能是Windows的东西)

我要做的是确保文件是在运行的容器中创建的

FROM mysql:5.7
RUN apt-get update && apt-get install -y anacron
COPY crontab /tmp/crontab

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

# Run the command on container startup
CMD (cat /tmp/crontab > /etc/cron.d/hello-cron ) && cron && tail -f /var/log/cron.log

它最近在debian和UbuntuWily(15.10)中得到了修复

作为一种解决方法,您可以尝试对模块pam_loginuid.so进行注释 在/etc/pam.d/cron内重新启动cron(或docker容器)


我投票决定以离题的方式结束这个问题,因为它属于AskUbuntu。@TinyGiant我能理解你的来历,但我认为这仍然是一个有效的问题,因为它也涉及docker。@TriNguyen你有想过这个问题吗?我有完全相同的问题,并希望避免冗长的日志调查,如果你找到一个解决方案@DaveNovelli不,我还没有弄明白这一点,不幸的是:(我仔细查看了日志后,它开始工作。我必须解决两件事:1)我使用windows,我的crontab文件的换行符是CRLF而不是LF。错误消息中的附加“^M”提示了我。2) 在我修复了这个问题之后,我出现了一个新的错误,表明命令错误。我意识到,因为我使用的是用户crontab文件,所以在命令开头不需要“root”。在那之后,它就像一个符咒。非常感谢@Dzamo提供的rsyslog提示!我在docker容器下也有同样的问题。您的解决方案对我有效,但我必须在/var/log(touch/var/log/syslog)下创建syslog文件,并将其所有者更改为syslog:adm(chown syslog:adm/var/log/syslog)。通过cron与syslog对话,我发现了这个:/usr/sbin/cron[2990]:(root)不安全模式(预期为模式0600)(crontab/root)。所以我必须设置正确的权限模式0600(chmod0600/var/spool/cron/crontab/root)。在那之后,一切正常。我在Docker容器中也遇到了这个问题。安装
rsyslog
,启动它并运行
cron-L15
神奇地运行了我的作业(我甚至没有检查日志)。所以我的cron作业命令没有错误。