Ubuntu 在不同主机上的Docker中运行cron时出现的问题

Ubuntu 在不同主机上的Docker中运行cron时出现的问题,ubuntu,cron,docker,coreos,Ubuntu,Cron,Docker,Coreos,我试图让一个docker容器运行来管理我的工作 我使用centOS 6.5 base在docker容器中运行一个非常简单的cron作为测试 * * * * * /bin/echo "it works!" >> test.log 如果容器在CoreOS主机上运行,它可以正常工作,但是如果我在Ubuntu13.10主机上运行容器,则不会执行cron。(我认为主机不会影响容器中运行的内容) 两台主机都运行docker 0.8 我是错过了一些明显的东西,还是这是一个错误 谢谢基本Docke

我试图让一个docker容器运行来管理我的工作

我使用centOS 6.5 base在docker容器中运行一个非常简单的cron作为测试

* * * * * /bin/echo "it works!" >> test.log
如果容器在CoreOS主机上运行,它可以正常工作,但是如果我在Ubuntu13.10主机上运行容器,则不会执行cron。(我认为主机不会影响容器中运行的内容)

两台主机都运行docker 0.8

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


谢谢

基本Docker容器不会启动像cron这样的服务-它们只启动您在ENTRYPOINT/CMD中指定的内容


一些“更胖”的容器使用诸如supervisord之类的东西来启动服务,但如果可能的话,将服务分离到不同的容器中并使用卷容器共享数据,或者--link

简短回答

将此行添加到dockerfile

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

据我所知,这个问题与CoreOS和Unbutu之间的内核差异有关。这反过来会导致pam安全问题

为了弄清楚这一点,我们首先需要打开cron的日志记录(因为我们在docker中,所以不执行正常启动)。跑

cron日志有此错误(位于此处/var/log/cron)

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

通过谷歌搜索,我发现我需要修改pam cond配置(在这里找到/etc/pam.d/crond) 编辑此文件并注释掉以下行

#session    required   pam_loginuid.so

重新启动crond,一切都会好起来

@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 

在我的例子中,我调试cron:

$ apt-get install rsyslog
$ rsyslogd
$ service cron restart
$ tail -f /var/log/syslog
并在日志中发现
硬链接数>1
错误

解决方案是将其放入
entrypoint.sh

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

谢谢你的建议。我的入口点是/bin/bash,所以我在测试正常的命令行。事实证明这是pamCan的一个安全问题,你可以扩展你的答案。我们需要在入口点中添加什么。请参阅以了解loginuid不起作用的原因。在我的例子中,我必须在
/etc/pam.d/cron
中注释掉它。现在它工作得很好。非常感谢你的提示!我在文件中有一个额外的空间,名称是
/etc/pam.d/cron
,而不是
/etc/pam.d/crond
。如果
sed
无法开箱即用,请不要感到惊讶!我的有这种味道:
RUN sed-i'/session required pam_loginuid.so/c\#session required pam_loginuid.so'/etc/pam.d/cron
Stackoverflow trims spaces:-(pam_loginuid.so前面有+1空格。另一种方法是:
cat/etc/pam.d/cron | grep-v pam_loginuid.so>/etc/pam.d/cron2&&mv/etc/pam.d/cron2/etc/pam.d/cron
,谢谢你的回答。使用sed的更好的方法是
sed-e'/pam_loginuid.so/s/^*/-i/etc/d/cron>
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 
$ apt-get install rsyslog
$ rsyslogd
$ service cron restart
$ tail -f /var/log/syslog
touch /etc/crontab /etc/cron.d/*