使用dockerfile制作定时执行任务镜像

1,122 阅读1分钟

基于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/bashecho ${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),确认定时任务有执行(最好保证执行的脚本和输出日志都是绝对路径,不然定时任务可能无法执行)

image-20220726175100365.png