docker定时任务

使用docker来构建一个镜像,并使用docker容器来处理定时任务。如果在集群里面,也能使用k8s的定时任务功功能,但是注意k8s的时间问题,比北京时间晚8小时。

资源

正文

docker

# echo "0 0 * * * $PWD/run.sh >> $PWD/run.log 2>&1"
docker run --rm  -t ldap2mysql:0.1  python3 ldap_save.py
# 注意不要加 -i 选项。

定时任务时,不要加 -i选项,因为会输出:

the input device is not a TTY

k8s的调度任务

rancher有导入yaml功能,直接导入下面的yaml,但是生成的yaml却非常的丑,看起来非常的复杂。

一次调度任务

apiVersion: batch/v1
kind: Job
metadata:
  name: ldap2mysql-for-qa
spec:
  template:
    spec:
      containers:
      - name: ldap2mysql-for-qa
        image: 10.11.9.12:5000/scc/ldap2mysql:0.1
        command: ["python3",  "ldap_save.py"]
      restartPolicy: Never
  backoffLimit: 4

定时调度任务

亮点就是,command是使用 -c参数,然后,理论上,能接非常多的shell内容,注意每调命令用;分割即可,或者用&&也行。

旧版本只能用batch/v1beta1,新版本能用batch/v1

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: ldap2mysql-for-qa
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: ldap2mysql-for-qa
            image: 10.11.9.12:5000/scc/ldap2mysql:0.1
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - sed -i "19d;20icfg = 'mysqldbsrv,3306,root,Root@123,qa_shadow'" ldap_save.py;python3 ldap_save.py
          restartPolicy: OnFailure

sh -c 命令格式

示例:1 1 * * * ,期待的是凌晨1点执行,结果最终执行是在早上9:01,因为时区的原因。(这个有点绕)

docker伪终端问题

上面写定时任务的时候,写了会报错,去掉-i即可,但是实际上,原文是去掉-t,即不要分配伪终端。没有想到,我直接去掉,不要输入,也没有问题。

dockername=$1
# 在容器内解压文件
docker exec -i ${dockername} bash <<EOL
tar -zxvf /tmp/my.tar.gz 
EOL