現在於 Linux 程式很多都包 Docker,而需要定期跑得程式,可以跑在 Docker 裡面(需要特別做),或者就是在外部 docker exec 執行
但是在 docker exec + crontab 的時候,就會遇到「the input device is not a TTY」 的錯誤,要怎麼解決呢?
Docker 外部 Cron 遇到 the input device is not a TTY 解法
Docker crontab 想要做 MySQL 的備份,所以做下述設定:
- crontab -e
- 0 1 * * * /usr/bin/docker exec -u root -it container-id mysqldump -u root -ppassowrd database-name > /home/user/backup/database-name.sql
- 這段直接執行都正常,但是進 crontab 就有問題,導出的 backup 都是空的
主要問題有兩個:
- -it 的功能
- -i, --interactive Keep STDIN open even if not attached
- -t, --tty Allocate a pseudo-TTY
- 因為 Crontab 裡面不會有回應,所以不要 -i (interactive mode)
- 從外面執行 Docker 內部的命令,需要完整路徑
- mysqldump 需要寫成 /usr/bin/mysqldump
- 所以正確寫法如下:
- 0 1 * * * /usr/bin/docker exec -u root -t container-id /usr/bin/mysqldump -u root -ppassowrd database-name > /home/user/backup/database-name.sql
- -it 改成 -t、mysqldump 改成 /usr/bin/mysqldump 就解決掉這些問題
然後,發現幾年前自己就已經寫了正確作法:Docker 的 Crontab 設定作法... XD