【问题标题】:Issues with executing user cron jobs in docker在 docker 中执行用户 cron 作业的问题
【发布时间】:2019-11-21 10:02:29
【问题描述】:

我正在尝试创建 docker 映像,它将从 root 和自定义用户执行 cronjobs。到目前为止,只有 root 用户在工作:

FROM amazonlinux:2017.09
RUN yum -y install ca-certificates shadow-utils cronie && yum -y clean all
# root cronjob
RUN echo '* * * * * echo "$USER - Working in a coal mine..." > /proc/1/fd/1 2>/proc/1/fd/2' > ~/cronjob
RUN chmod 0644 ~/cronjob
RUN crontab ~/cronjob
RUN useradd -ms /bin/bash ansible
# Ansible cronjob
USER ansible
RUN echo '* * * * * echo "$USER - Working in a coal mine..." > /proc/1/fd/1 2>/proc/1/fd/2' > ~/cronjob
RUN chmod 0644 ~/cronjob
RUN crontab ~/cronjob
USER root
CMD ["/usr/sbin/crond", "-n"]

我使用这个命令 docker build -t demotest -f Dockerfile . 构建了这个 docker 我使用此命令执行创建的图像docker run -t -i demotest:latest

执行结果:

> docker run -t -i demotest:latest
root - Working in a coal mine...
root - Working in a coal mine...
root - Working in a coal mine...
root - Working in a coal mine...

一些细节:

docker run -t -i demotest:latest bash -c 'ls -l /home/ansible/cronjob'
-rw-r--r-- 1 ansible ansible 81 Jul 11 16:06 /home/ansible/cronjob

docker run -t -i demotest:latest bash -c 'ls -l /root/cronjob'
-rw-r--r-- 1 root root 81 Jul 11 16:06 /root/cronjob

docker run -t -i demotest:latest bash -c 'crontab -u root -l'
* * * * * echo "$USER - Working in a coal mine..." > /proc/1/fd/1 2>/proc/1/fd/2

docker run -t -i demotest:latest bash -c 'crontab -u ansible -l'
* * * * * echo "$USER - Working in a coal mine..." > /proc/1/fd/1 2>/proc/1/fd/2

我做错了什么?

更新信息

我将CMD 更改为如下所示:CMD ["/usr/sbin/crond", "-n", "-x", "sch"]

这产生了输出:

docker run -t -i demotest:latest
debug flags enabled: sch
[1] cron started
log_it: (CRON 1) INFO (RANDOM_DELAY will be scaled with factor 85% if used.)
log_it: (CRON 1) INFO (running with inotify support)
[1] GMToff=0
[1] Target time=1562865060, sec-to-wait=12
user [root:0:0:...] cmd="run-parts /etc/cron.hourly"
user [root:0:0:...] cmd="[ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.monthly"
user [root:0:0:...] cmd="[ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.weekly"
user [root:0:0:...] cmd="[ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.daily"
user [ansible:500:500:...] cmd="echo "$USER - Working in a coal mine..." > /proc/1/fd/1 2>/proc/1/fd/2"
user [root:0:0:...] cmd="echo "$USER - Working in a coal mine..." > /proc/1/fd/1 2>/proc/1/fd/2"
Minute-ly job. Recording time 1562865061
[1] Target time=1562865120, sec-to-wait=60
Minute-ly job. Recording time 1562865061
log_it: (root 8) CMD (echo "$USER - Working in a coal mine..." > /proc/1/fd/1 2>/proc/1/fd/2)
log_it: (ansible 9) CMD (echo "$USER - Working in a coal mine..." > /proc/1/fd/1 2>/proc/1/fd/2)
root - Working in a coal mine...

这表明自定义用户 cronjob 已执行但输出未重定向。 所以问题变成了——如何正确地将标准输出重定向到主机控制台?

【问题讨论】:

  • 假设:由于 cron 守护进程以 root 身份运行,/proc/1/fd/1 归 root 所有,非 root 的 cron 作业不能在那里写入。
  • 你很可能是正确的。如果有任何解决方法,您会建议什么?

标签: docker cron dockerfile


【解决方案1】:

更改 Dockerfile 的最后一行:

来自

CMD ["/usr/sbin/crond", "-n", "-x", "sch"]

CMD ["cron", "-f"]

注意: cron -f --> cron 前台

【讨论】:

  • 这是不正确的。 Amazon linux 使用没有参数 -f 的 cronie crond。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 2021-06-10
  • 2015-01-05
  • 1970-01-01
  • 2020-05-16
  • 2018-12-27
  • 2017-11-10
相关资源
最近更新 更多