Featured image of post docker crontab 定期排程执行程式

docker crontab 定期排程执行程式

用 docker 建立的环境,我们会需要定期排程的去执行指定的程式

在 docker 我们会建立自己专案的环境,让他可以运行我们的专案、看是 php、python、golang … 之类的运行环境,而专案会需要定期排程去执行指定的程式,以下以 php 为例

建立自订 crontab 档案

在专案下会建立一个 crontab 指令的档案 my_docker_crontab

# my_docker_crontab
# m h  dom mon dow   command
* * * * * /app/job.php

环境安装 cron

映像档通常是最小单位的档案,所以不会有 cron 的排程程式,所以在建立 Docker 环境时必须要自己指定去安装 cron 软体,这样就可以在我们自己自定义的环境去跑 cron 定期排程去执行程式

RUN apt-get update && apt-get install -y cron

加入自订的 crontab 档案

在 docker 专案下将 crontab 指令的档案 my_docker_crontab 複製到 docker 的目录下,并指定 crontab 去执行此 crontab 档案

# 加入 docker 专案的自订 crontab
ADD my_docker_crontab /etc/cron.d/my_docker_crontab
# 指定 crontab 档案
RUN crontab /etc/cron.d/my_docker_crontab

执行 crontab

在最后使用指令执行 crontab,这样就可以开始每分钟定期执行程式了

# 执行 crontab
CMD ["cron", "-f"]

以下是完整的 Dockerfile 档案

FROM php:7.4-fpm
WORKDIR /var
RUN apt-get update && apt-get install -y cron libpq-dev libpng-dev libzip-dev zip
RUN docker-php-ext-install pgsql pdo_pgsql gd zip\
&& docker-php-ext-enable opcache

# 加入 docker 专案的自订 crontab
ADD my_docker_crontab /etc/cron.d/my_docker_crontab
# 指定 crontab 档案
RUN crontab /etc/cron.d/my_docker_crontab

# 执行 crontab
CMD ["cron", "-f"]

执行 docker-compose

将执行 Dockerfile 的设定写在 docker-compose.yml 档案,并执行 docker-compose up -d 将 cronjob 的容器放在背景执行

# docker-compose.yml
version: '3'

services:
  cronjob:
    container_name: docker_php_cronjob
    build: .
    image: docker_php_cronjob:v1.0
    volumes:
      - /web/app/:/app
    restart: always
docker-compose up -d

参考资料

comments powered by Disqus
All rights reserved,未經允許不得隨意轉載
Built with Hugo
主题 StackJimmy 设计