我试图在docker容器中运行一个cron作业
但没有任何对我有用
我的容器只有cron.daily和cron.weekly文件
crontab,cron.d,cron.hourly ......我的容器中没有
crontab -e也无法正常工作
我的容器使用/ bin / bash运行
答案 0 :(得分:72)
以下是我如何运行我的一个cron容器。
<强> Dockerfile:强>
FROM alpine:3.3
ADD crontab.txt /crontab.txt
ADD script.sh /script.sh
COPY entry.sh /entry.sh
RUN chmod 755 /script.sh /entry.sh
RUN /usr/bin/crontab /crontab.txt
CMD ["/entry.sh"]
<强> crontab.txt 强>
*/30 * * * * /script.sh >> /var/log/script.log
<强> entry.sh 强>
#!/bin/sh
# start cron
/usr/sbin/crond -f -l 8
<强> script.sh 强>
#!/bin/sh
# code goes here.
echo "This is a script, run by cron!"
像这样构建
docker build -t mycron .
像这样运行
docker run -d mycron
添加自己的脚本并编辑crontab.txt,然后构建图像并运行。由于它是基于高山,因此图像非常小。
答案 1 :(得分:13)
感谢这个模板。
我只想知道 entry.sh
中的一行 /usr/sbin/crond -f -L 8
crond -help产量:
Usage: crond -fbS -l N -d N -L LOGFILE -c DIR
-f Foreground
-b Background (default)
-S Log to syslog (default)
-l N Set log level. Most verbose:0, default:8
-d N Set log level, log to stderr
-L FILE Log to FILE
-c DIR Cron dir. Default:/var/spool/cron/crontabs
所以也许你想宁愿把小l
/usr/sbin/crond -f -l 8
不是大'L'
/usr/sbin/crond -f -L 8
将日志级别设置为默认值,因为似乎没有指定名为8
的日志文件。
答案 2 :(得分:3)
crond 与Alpine上的tiny配合良好
#
但由于僵尸收割问题和信号处理问题,不应该作为容器主进程(PID 1)运行。有关详细信息,请参阅this Docker PR和this blog post。
答案 3 :(得分:0)
Here is good explanation of cron problems inside docker container:
Docker文件示例:
FROM alpine
# Copy script which should be run
COPY ./myawesomescript /usr/local/bin/myawesomescript
# Run the cron every minute
RUN echo '* * * * * /usr/local/bin/myawesomescript' > /etc/crontabs/root
CMD ['crond', '-l 2', '-f']
答案 4 :(得分:0)
@ken-cochrane 的解决方案可能是最好的,但是,还有一种无需创建额外文件的方法。
要走的路是在您的 entrypoint.sh
文件中设置 cron。
Dockerfile
...
# Your Dockerfile above
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
echo "* * * * * echo 'I love running my crons'" >> /etc/crontabs/root
crond -l 2 -f > /dev/stdout 2> /dev/stderr &
# You can put the rest of your entrypoint.sh below this line
...