首页 > 解决方案 > 来自主机的容器内的 Cron 任务

问题描述

我正在尝试从主机的容器内执行 cron 任务,但没有运气。从主机我添加以下行crontab -e

* * * * * docker exec -it sample_container bash -c 'touch /selected/directory/temp$(date +%H-%M)'

但这不起作用。有趣的是,当我在 crontab 之外独立运行命令时,它正在成功执行。谁能解释我在这里错过了什么?

标签: dockercroncontainerscron-task

解决方案


注意:当使用 cron 调试此类问题时,您应该在本地系统邮件中查找错误,或者通过添加MAILTO=yourmail@yourdomain.com到您的 crontab 文件顶部将错误重定向到您的真实邮件。


您的 crontab 命令有 2 个问题

TLDR;固定的 cron 表达式

* * * * * docker exec sample_container bash -c 'touch /selected/directory/temp$(date +\%H-\%M)'

% 在 crontab 中有特殊含义

man -s 5 crontab

命令中的百分号 ( %),除非使用反斜线 ( \) 转义,否则将更改为换行符,并且第一个之后的所有数据%都将作为标准输入发送到命令。

所以你需要%在你的日期格式字符串中转义这些标志

Cron 不分配 tty

Cron 不分配 tty,而您在执行命令时尝试使用一个(即-t选项 to docker exec)。因此,该命令将失败并出现错误the input device is not a TTY

无论如何,您不需要进行交互 ( -i) 也不需要为此命令分配 tty 来完成它的工作,因此您必须放弃这些选项才能从 cron 启动它。


推荐阅读