docker笔记9--Docker镜像中使用crontab

docker笔记9--Docker镜像中使用crontab

1 介绍

工作中经常会使用cron,物理机上使用非常简单,但是大部分docker容器中默认没有cron且没有启动cron服务,直接使用不太方便。因此,笔者根据日常经验,将cron服务打包到docker镜像中,实现容器启动后定时执行cron中的任务。
该方法仅仅在ubuntu系统中测试过,其它系统中crontab保存的路径是否为/var/spool/cron/crontabs/笔者暂未逐一测试。若使用其它基础系统,建议先确认crontab的保存路径后,再参考笔者方法加以修改。

2 打包方法

2.1 思路

  1. 系统中要安装cron
    默认基础镜像可能没有安装cron,因此需要apt-get install cron -y
  2. 配置cron命令
    正常情况下,直接在服务器中通过crontab -e 来编辑crontab;而实际部署服务的时候不合适手动添加cron命令,因此需要提前配置好crontab的文件,并把它拷贝到镜像 /var/spool/cron/crontabs/ 目录下(该目录下的文件为cron服务默认存储的位置,每个配置cron命令的用户都会在该目录下生成一个对应的文件),格式为 /var/spool/cron/crontabs/user_name(若为root用户则将user_name 更改为root即可)。
  3. 确保容器启动时候运行cron服务
    默认情况下cron服务没有启动,因此需要在容器启动命令中手动添加一个service cron start 来启动cron服务。

2.2 案例

本案例基于ubuntu系统,安装python3,部署一个基础flask app,并且每分钟都将系统当前时间写入/home/flask/dt.txt 中。
该案例依赖 app.py Dockerfile readme.md root 等4个文件。
app.py

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_root():
    print('v1.2 Hello Root!\n')
    return 'v1.2 Hello Root!\n'


@app.route('/hello')
def hello_world():
    print('v1.2 Hello World!\n')
    return 'v1.2 Hello World!\n'


if __name__ == '__main__':
    app.run(host='0.0.0.0')

root

* * * * * date >/home/flask/dt.txt

Dockerfile

FROM ubuntu:20.04
RUN mkdir -p /home/flask
WORKDIR /home/flask
COPY app.py .
COPY root /var/spool/cron/crontabs/root
# COPY sources.list /etc/apt/sources.list
RUN apt-get update && apt-get install cron -y && apt-get install curl -y && apt-get install python3 -y && apt-get install python3-pip -y && pip3 install flask
CMD  service cron start && python3 app.py

readme.md

# ubuntu_cron
docker build -t ubuntu_cron:v1.0 .
docker run --name=ubuntu_cron -d -p 5000:5000 ubuntu_cron:v1.0
docker tag ubuntu_cron:v1.0 dockerhub.xxx.com/xg/ubuntu_cron:v1.0

3 测试

通过上述readme.md 中的命令打包镜像,然后运行镜像,测试效果。
在这里插入图片描述
如上图,进入容器中发现cron进程正常启动,crontab中正常加载了定时命令,也定时向dt.txt中写入相应日期数据。

4 说明

镜像基础系统为ubuntu20.04

猜你喜欢

转载自blog.csdn.net/u011127242/article/details/112492657