Docker:為不同的容器執行 Cronjob
我正在尋找有關為我的 php fpm 容器執行 cronjobs 的最佳實踐。
現在正在執行:
- NGINX 容器
- PHP FPM 容器
- MySQL 容器
我現在希望執行另一個名為“Cronjob Container”的容器,它在我的 PHP FPM 容器中執行腳本(我需要一些 PHP 依賴項)。
所以三種可能的解決方案:
1.) 執行自己的容器
我很想使用這個解決方案!
最好有一個執行 CRON 的容器,我可以(以某種方式)在我的 php fpm 容器上呼叫 docker exec ……或者有另一種方式。
2.) 在 PHP 容器內執行 CRON
這沒關係,但不是最佳做法。我可以在執行 cron 的 php fpm 容器中啟動第二個程序。這會起作用,但我不確定這是否是你應該與 docker 一起工作的人。
3.) 執行主機 Cron
這將是殘酷的。我需要找到給定路徑的 processID 和 containerID,然後執行 docker exec。但這或多或少是我最後的方式……而且我討厭在沒有部署的情況下管理 cronjobs。
那麼這裡最好的方法是什麼?
祝你今天過得愉快,
巴斯蒂安
我編寫了一個守護程序,用於觀察容器並在其元數據中定義的作業調度。這最接近您的 1) 解決方案。例子:
version: '2' services: wordpress: image: wordpress mysql: image: mariadb volumes: - ./database_dumps:/dumps labels: deck-chores.dump.command: sh -c "mysqldump --all-databases > /dumps/dump-$$(date -Idate)" deck-chores.dump.interval: daily
“經典”,類似 cron 的配置也是可能的。
Cron 本身可以在前台 (
cron -f
) 中安裝和執行,使其非常容易安裝在容器中。要訪問其他容器,您可能會在客戶端 CLI 的同一容器中安裝 docker(而不是執行守護程序)。然後訪問宿主機docker環境,最常見的解決方案是綁定掛載docker socket(-v /var/run/docker.sock:/var/run/docker.sock
)。唯一的問題是您需要在容器內設置 docker gid 以匹配主機 gid,然後將容器內的使用者添加到 docker 組。這確實意味著這些使用者與主機上的任何 docker 使用者具有相同的訪問權限,例如 root 級別訪問權限,因此您需要完全信任送出他們的使用者,或者限制他們可以使用某種 sudo 等效項執行的命令。另一個缺點是它的可移植性較差,並且具有安全意識的管理員不太可能批准在他們的系統上執行您的容器。
使用像 supervisord 這樣的工具可以很容易地回退到選項 B。雖然不是理想的“每個容器一個程序”,但它也不是一種反模式,因為它將整個容器和依賴項保持在一起,並消除了主機的任何安全風險。
無論您選擇第一個還是第二個選項,都取決於您的環境,誰在送出作業,需要多少個容器來送出針對自己的作業等等。如果是管理員針對大量容器送出作業,那麼 cron 容器使感覺。但是,如果您是需要在您的應用程序中包含計劃作業的應用程序開發人員,請選擇第二個選項。