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
|