基于debian系统制作定时执行任务镜像。制作过程遇到几个难题:
1.怎么让docker运行时,crontab的服务是启动状态?
2.dockerfile的环境变量怎么传递给脚本使用?
3.怎样在crontab中添加定时任务?
所有的问题都在下面的这个dockerfile文件中解决了。
1.编写dockerfile文件:
FROM debian:10
ADD test.sh /opt/test.sh
#获取cron下载资源列表
RUN sed -i '/jessie-updates/d' /etc/apt/sources.list # Now archived
#cron下载
RUN apt-get update && apt-get -y install cron
ADD stup.sh /etc/init.d/stup.sh
#将启动cron的脚本放在/ect/init.d/目录下,开机自启动cron,ENTRYPOINT执行脚本
ENTRYPOINT ["./etc/init.d/stup.sh"]
#添加环境变量到容器内部的/etc/profile中,crontab无法识别dockefile中ENV设置的环境变量
RUN echo 'HELLO_WORLD="hello world" \nLIGHT_HOUSE="light house" \nexport HELLO_WORLD \nexport LIGHT_HOUSE' >> /etc/profile
#为crontab添加定时任务,执行 . /etc/profile 使配置的环境变量生效
RUN echo '* * * * * . /etc/profile && /opt/test.sh >> /opt/test.log 2>&1 &' | crontab
2.编写cron启动脚本stup.sh:
#!/bin/bash
/etc/init.d/cron start
#将容器挂起,防止容器后台启动后自动退出
tail -f /dev/null
3.编写要执行的脚本内容,并输出到日志文件中:
#!/bin/bash
echo ${HELLO_WORLD} ${LIGHT_HOUSE}
4.构建镜像
docker build -t cron_test:0.1 .
5.启动docker容器
docker run -id --name crondt cron_test:0.1
6.进入容器(docker exec -it crond bash),查看cron服务运行状态(service cron status),查看设置的环境变量(cat etc/profile)
并查看定时任务输出的文件(cat opt/test.log),确认定时任务有执行(最好保证执行的脚本和输出日志都是绝对路径,不然定时任务可能无法执行)