在不同主机上的Docker中运行cron的问题

我试图让docker容器运行来pipe理我的cronjobs

即时通讯运行一个非常简单的cron作为一个dockertesting容器使用centOS 6.5基地的testing

* * * * * /bin/echo "it works!" >> test.log 

它工作正常,如果容器在CoreOS主机上运行,​​但是如果我在Ubuntu 13.10主机上运行容器cron不执行。 (我虽然主机没有影响什么在容器中运行)

两台主机都在运行docker 0.8

我错过了一些明显的东西,或者这是一个错误?

谢谢

简短的回答

将此行添加到您的dockerfile

 RUN sed -i '/session required pam_loginuid.so/c\#session required pam_loginuid.so' /etc/pam.d/crond 

长的答案

从我所了解的问题是与CoreOS和Unbutu之间的内核差异有关。 这反过来导致一个pam安全问题。

我们首先需要打开日志记录的cron(因为我们在码头正常启动没有执行)。 跑

 service rsyslog start service crond restart 

cron日志有这个错误(位于/ var / log / cron)

 FAILED to open PAM security session (Cannot make/remove an entry for the specified session) 

所以然后我看了一下安全日志,它有这个错误(位于/ var / log / secure)

 pam_loginuid(crond:session): set_loginuid failed 

一些更多的使用google搜索,发现我需要修改我的pam cond config(在这里找到/etc/pam.d/crond)编辑这个文件并注释掉以下行

 #session required pam_loginuid.so 

重新启动crond,一切都应该是好的

基础Docker容器不会像cron一样启动服务 – 它们只能启动您在ENTRYPOINT / CMD中指定的内容

一些“较胖”的容器使用像supervisord这样的东西来启动服务 – 但在可能的情况下,它更易于将服务分离到不同的容器中,并使用容器容器共享数据,或者 – 链接

@ dwitz的答案是正确的,但我不得不改变sed命令,使它在Docker容器中的Ubuntu 16.04上工作。

 cat /etc/pam.d/cron |sed -e "s/required pam_loginuid.so/optional pam_loginuid.so/g" > /tmp/cron && mv /tmp/cron /etc/pam.d/cron