【问题标题】:Issues running cron in Docker on different hosts在不同主机上的 Docker 中运行 cron 的问题
【发布时间】: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

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

谢谢

【问题讨论】:

标签: ubuntu cron docker coreos


【解决方案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
      • Stackoverflow 修剪空格 :-(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 的安全问题
      • 您能否扩展您的答案。我们需要在入口点中放入什么。
      猜你喜欢
      • 1970-01-01
      • 2019-10-13
      • 2020-03-26
      • 1970-01-01
      • 2021-03-04
      • 2014-01-06
      • 2022-10-06
      • 1970-01-01
      • 2015-11-18
      相关资源
      最近更新 更多