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
Theme Stack designed by Jimmy