Docker 的 Crontab 設定作法

Docker 核心概念是 Microservice,所以應該盡量不要進去機器做 Cron 的設定,要再外部控制 Cron 的執行才是。

Crontab 主要是希望在環境裡面跑那隻程式,所以只要由外部呼叫程式執行,程式都在 Docker 的環境裡面跑,並不是外部的環境,就不會有任何影響。

所以從 Docker 教學第一行 Hello 就有示範怎麼玩了~

  • docker exec CONTAINER-NAME exec-script-name
  • docker exec -t CONTAINER-NAME /full-path/exec-script-name
  • docker exec -t CONTAINER-NAME exec-script-name
  • 註1:若遇到 Bash 要多個命令使用 ; 分別執行的,可以使用 bash -c 的命令
  • 註2:千萬不要 -it,進入 interactive 就會有 tty 的錯誤出現

Docker 的 Crontab 設定作法

以下前面有一堆 * 的,都是在外部環境使用 crontab -e 後,寫在裡面的語法。

官方建議的寫法

  • 官方說明文件:docker exec | Docker Documentation
    • * * * * * docker exec -t {containerID} {command} >> /dev/null 2>&1
    • 範例: * * * * * docker exec -t $(docker ps -qf "name=dockerphp1") php artisan schedule:run >> /dev/null 2>&1
    • 更多範例:
      • docker exec -t mycontainer sh -c "echo a && echo b"
      • docker exec -u user-account mycontainer rsync -av hostname:/tmp/filename /tmp/.

相關的範例寫法

  • */2 * * * * docker exec CONTAINER-NAME ls
  • */2 * * * * docker exec CONTAINER-NAME bash -c "cd /tmp;ls"
  • */2 * * * * docker exec CONTAINER-NAME /usr/bin/mysqldump
  • 0 2 * * * * docker exec CONTAINER-NAME certbot renew
  • */2 * * * * /usr/bin/docker exec CONTAINER-NAME /home/user/bin/test.php
    • cat /home/user/bin/test.php
      #!/usr/bin/php
      <?php
      echo "test cron"; 
      error_log(date('Y-m-d H:i:s') . ": test cron to file\n", 3, '/tmp/test'); 
      // 之後去看 /tmp/test 這個檔案,就可以知道運行狀況
      ?>

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈Docker 的 Crontab 設定作法〉中有 3 則留言

  1. 有想過這樣寫過,但是又會顧慮到如果如此執行排程,那麼每次crontab執行就需要進去docker內執行指令一次,當crontab指令多的時候,感覺"一直進入"docker這件事情會是個負擔 ... (?

    1. 不會喔,docker container run 起來後,你就把他想成一個 proecess 在那邊跑,你只是呼叫他在裡面再做些動作的意思而已~ 不是起新的 container,所以沒有這麼重的負擔~ 🙂

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料