在 alpine 容器中使用 crontab
今天在开发 Steem Watcher 过程中,由于需要跑计划任务,所以研究了一下如何在容器环境下使用 crond
。
在此之前,我曾经使用宿主机的 crond
来启动一个临时容器跑任务,但这个思路很糟糕,并不方便快速移植。于是考虑还是要基于容器内部进行计划任务才是终极方案。
由于我的 Steem Watcher 使用的镜像是我自己基于 alpine
编译的,而 alpine
中已经带有 crond
程序,所以要在容器里实施计划任务还是比较轻松。
我们可以先看下 crond
的参数说明
1 | /app # crond -h |
介于容器执行命令不能立即返回,所以我们需要使用 -f
参数让 crond
在前台运行,这样可以保持容器一直运行。
然后查了下手册,发现 crond
的配置文件在 /etc/crontabs/
目录下面。这里需要注意,由于每个用户的 crontab
是独立的,如果你是 root
用户启动,那么其配置文件为 /etc/crontabs/root
。
弄明白这些之后,我们想要搞计划任务的话,只需要创建个容器,让其 command
命令是 crond -f
,然后把一个配置好的文件 mount
到容器里的 /etc/crontabs/root
,再把需要执行的程序 mount
进去,最后启动即可了。
具体可以参考 https://github.com/ety001/steem-watcher/blob/master/docker-compose.yml#L28 这里了解。
除此之外还需要 额外注意的事情 就是,如果通过挂载的方式覆盖
/etc/crontabs/root
,那么在宿主机上的配置文件,需要配置为755
权限,并且用户和用户组需要设置为root
。