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

Posted

技术标签:

【中文标题】在不同主机上的 Docker 中运行 cron 的问题【英文标题】:Issues running cron in Docker on different hosts 【发布时间】:2014-03-22 11:56:19 【问题描述】:

我正在尝试运行一个 docker 容器来管理我的 cronjobs

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

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

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

两台主机都在运行 docker 0.8

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

谢谢

【问题讨论】:

请参阅***.com/questions/21391142/… 了解为什么 loginuid 不起作用。 【参考方案1】:

就我而言,我调试 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/*

然后轰隆隆!

【讨论】:

【参考方案2】:

@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 

【讨论】:

【参考方案3】:

简短回答

将此行添加到您的 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,一切都会好的

【讨论】:

就我而言,我不得不在/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 *** 修剪空格 :-(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/pam.d/crond【参考方案4】:

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

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

【讨论】:

感谢 SvenDowideit 的建议。我的入口点是 /bin/bash 所以我正在测试正常的命令行。原来是 pam 的安全问题 您能否扩展您的答案。我们需要在入口点中放入什么。

以上是关于在不同主机上的 Docker 中运行 cron 的问题的主要内容,如果未能解决你的问题,请参考以下文章

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

从 docker 容器(linux 上的 docker)访问主机 postgresql

在同一主机上的不同网络中的 Docker 容器之间进行通信

共享主机上的 CodeIgniter Cron 作业?

在 Elastic Beanstalk 上的 docker 中的 cron 作业中访问 S3

在主机上具有进程ID的docker容器上映射应用程序的进程ID