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 這個檔案,就可以知道運行狀況 ?>
- cat /home/user/bin/test.php
相關網頁
- How to run a cron job inside a docker container?
- bash - Script to change current directory (cd, pwd)
- How to change work directory when run 'docker exec /bin/bash' - Quora
- docker exec -it $(docker ps -l -q) bash -c 'cd $BUILDENV; exec "${SHELL:-sh}"'
- docker exec -it your_image_tag bash -c 'cd /some/directory; exec "${SHELL:-sh}"'
- Docker Exec Command With Examples
- Connect to docker container as user other than root
- docker exec bash -c "command1 ; command2 ; command3"
- docker exec 74f86665f0fd bash -c "cd /var/log ; cat dmesg "
- Executing a command in a specific directory
- docker exec -w /path/to/directory <command></command>
- docker exec -w /var/log 74f86665f0fd cat dmesg
- 在 Dockerfile 灌 Cron 來執行的作法
- https://github.com/Ekito/docker-cron
- https://github.com/cheyer/docker-cron
- # config json
- https://hub.docker.com/r/willfarrell/crontab
- https://github.com/willfarrell/docker-crontab/blob/master/Dockerfile
有想過這樣寫過,但是又會顧慮到如果如此執行排程,那麼每次crontab執行就需要進去docker內執行指令一次,當crontab指令多的時候,感覺"一直進入"docker這件事情會是個負擔 ... (?
不會喔,docker container run 起來後,你就把他想成一個 proecess 在那邊跑,你只是呼叫他在裡面再做些動作的意思而已~ 不是起新的 container,所以沒有這麼重的負擔~ 🙂