在docker中使用cron

docker crond解决方案

容器技术给我们带来极大便利的同时也带来一些必须要做的改变,比如以前在应用服务器中运行的cron定时任务就不能用原有的方式运行。
本文基于centos,介绍如何解决使用容器技术时的定时任务问题。

具体思路就是:
在你的应用环境image上面再commit一层crond
1.封装一个应用image
2.封装一个crond image,但是以应用image为base

假设已有的应用环境image为 arkii/lamp 是我的 php运行环境

mkdir build && cd build
cat Dockerfile

FROM arii/lamp
MAINTAINER Arkii sqy6@163.com
RUN yum -y install vixie-cron supervisor && yum clean all && rm -f /var/log/yum.log
RUN sed -ie '/pam_loginuid/d' /etc/pam.d/crond
ADD supervisord.conf /etc/supervisord.conf
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]

cat supervisord.conf

[supervisord]
nodaemon=true
[program:crond]
command=/usr/sbin/crond -n
log_stdout=true
log_stderr=true
logfile=/db/logs/crond.log
logfile_maxbytes=512MB
logfile_backups=10
[program:crontab]
command=/usr/bin/crontab /db/config/crontab

从宿主机启动crond容器

宿主机中

日志目录/db/logs

crontab文件存放位置/db/app/config/crontab

在宿主机中修改/db/app/config/crontab 容器中inotify机制会自动更新crontab,不需重启容器。

#!/bin/bash
APPNAME='crond-in-container'
APPID=$(docker ps| grep ${APPNAME} | awk '{print$1}')
if [ -z ${APPID} ]
then
echo "${APPNAME} not running ..."
else
docker stop ${APPID}
docker rm ${APPID}
fi
docker run -d --name=${APPNAME} \
-v /db/logs:/db/logs \
-v /db/app/config/crontab:/db/config/crontab \
arkii/crond