Docker 外部 Cron 遇到 the input device is not a TTY 解法

現在於 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 的備份,所以做下述設定:

  1. 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
  2. 這段直接執行都正常,但是進 crontab 就有問題,導出的 backup 都是空的

主要問題有兩個:

  1. -it 的功能
    • -i, --interactive Keep STDIN open even if not attached
    • -t, --tty Allocate a pseudo-TTY
    • 因為 Crontab 裡面不會有回應,所以不要 -i (interactive mode)
  2. 從外面執行 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
  3. -it 改成 -t、mysqldump 改成 /usr/bin/mysqldump 就解決掉這些問題

然後,發現幾年前自己就已經寫了正確作法:Docker 的 Crontab 設定作法... XD

作者: Tsung

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

發表迴響

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