3种实现方案

  1. 使用宿主机的cron实现定时任务
  2. 在原有容器安装cron
  3. 创建专门执行定时任务新容器

    方式一踩坑

    0 7 * /usr/bin/docker exec -i report /bin/bash -c ‘export LANG=en_US.UTF-8 && /usr/bin/python /app/msp_report/bin/msp_daily_report.py’ >> /tmp/daliy.log 2>&1

这里docker命令不需要加-t,-t会分配一个伪终端,但计划任务无法进入任何终端。
加上t参数,可以在cron的日志里看到执行记录

cron或者cron-YYYYMMDD Mar 9 09:00:01 AliYun CROND[13544]: (root) CMD (/usr/bin/docker exec -it report /bin/bash -c ‘export LANG=en_US.UTF-8 && /usr/bin/python /app/msp_report/bin/msp_daily_report.py’) Mar 9 09:00:01 AliYun CROND[13545]: (root) CMD (/usr/lib64/sa/sa1 1 1) Mar 9 09:00:01 AliYun CROND[13540]: (root) MAIL (mailed 30 bytes of output but got status 0x004b#012)

查看mail需要修改/etc/postfix/main.cf,将
inet_interfaces = localhost
inet_protocols = all
改成:
inet_interfaces = all
inet_protocols = all
在重启postfix,即可使用mail命令查看邮件,但具体的报错还是重定向到日志文件比较好排查
image.png
以上为加了-t参数执行的报错

方式二

加了crond任务容器启动需要systemd进程并且使用特权
docker run -d —name centos7 —privileged=true centos:7 /usr/sbin/init