27

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

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

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

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

两台主机都在运行 docker 0.8

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

谢谢

4

4 回答 4

50

简短的回答

将此行添加到您的 dockerfile

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

长答案

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

为了弄清楚我们首先需要为 cron 启用日志记录(因为我们在 docker 中正常启动不会执行)。跑

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

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

#session    required   pam_loginuid.so

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

于 2014-02-21T08:15:42.573 回答
1

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

一些“胖”容器使用诸如 supervisord 之类的东西来启动服务——但在可能的情况下,将服务分成不同的容器并使用卷容器共享数据更易于维护,或者 --link

于 2014-02-21T07:50:24.313 回答
1

@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 
于 2017-05-26T12:10:48.587 回答
0

就我而言,我调试 cron:

$ apt-get install rsyslog
$ rsyslogd
$ service cron restart
$ tail -f /var/log/syslog

NUMBER OF HARD LINKS > 1并在日志中发现错误。

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

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

和繁荣!

于 2018-07-08T13:38:17.533 回答