Docker使用cron定时任务


Docker在部署WEB环境时非常好用,一键即可完整部署,还不受限于具体的主机系统。

不过在使用cron定时,主机运行好好的,到了docker容器中却遇到各式各样的问题。

到底如何在容器中启用cron?

在主机和在容器中使用cron,那种更好?

这里我们列出集中用于定时的方案:

  1. 使用主机的cron实现定时任务
  2. 创建一个新容器专门执行定时任务
  3. 在原有容器上安装cron,里面运行2个进程

注意,我们这里所说的cron,包括传统的 cron 工具,或者其他的时间服务程序,它们功能是一样的。

这里我们不讨论选项3,因为从docker的原则上来看,选项3本身就不是个好的方式

我觉得最佳的方式应该是方式1,因为它最为简单。

比如,我在使用 Docker 搭建的一键 LNMP 环境(https://www.awaimai.com/2120.html)中,

会定时执行 Nginx 容器中的Certbo命令,以更新 HTTPS/SSL 证书的:

certbot renew

如果在主机中执行(dnmp_nginx_1是容器的名称):

docker exec -it dnmp_nginx_1 certbot renew

那在主机中的crontab中就可以:

0 2 * */2 * docker exec -it dnmp_nginx_1 certbot renew

这就实现了主机通过docker命令定时执行容器内命令。

如果由于某种原因,不能使用方式1,那就退而求其次,使用方式2

方式2有一些现成的方案可以使用:https://hub.docker.com/r/willfarrell/crontab

因为这种方式略重,而且必须要同步cron脚本,

所以方式1是优先考虑的方案

 

参考资料:

  1. Docker Tip #40: Running Cron Jobs on the Host vs. in a Container
  2. How to run a cron job inside a docker container?

2条评论

buff says: 回复

你好,博主感谢你写的这些博客,我学到了许多.曾经从10点看你博客到深夜4点.近期看到你的github点赞了一个全国行政区域的仓库,我看了一下他那个不怎么全.我自己在自学的时候搞到了一份2017版的全国行政区域共有4万多条记录.望对你有用.
https://github.com/buffge/loadCitys

歪麦 says:

厉害:)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *