DocsAplikasi
Scheduled jobs
Menjalankan perintah terjadwal (cron) atau manual di konteks aplikasi, managed database, atau stack compose — migrasi, pembersihan, laporan.
- Lingkup
- Aplikasi, database, stack compose
- Target
- Di container · Container terpisah
- Riwayat
- 50 run terakhir, output 64 KB
Tiga pemilik job
| Pemilik | Di mana | Di container | Container terpisah |
|---|---|---|---|
| Aplikasi | Tab Jobs aplikasi | exec di container aplikasi | Image aplikasi saat ini + env & mount aplikasi |
| Managed database | Tab Jobs database | exec di container database | Image engine (psql/mysql/redis-cli tersedia) dengan env DB_HOST DB_PORT DB_USER DB_PASSWORD DB_NAME — sama seperti resep backup |
| Stack compose | Tab Jobs stack | exec di container Service yang dipilih | Image & env service itu |
Contoh job database (Container terpisah, PostgreSQL)
psql -h "$DB_HOST" -U "$DB_USER" -d "$DB_NAME" -c "VACUUM ANALYZE"Dua target eksekusi
| Target | Cara jalan | Konsekuensi |
|---|---|---|
| Di container | docker exec di container aplikasi yang sedang running. | Berbagi CPU/RAM dengan aplikasi. Gagal bila aplikasi stopped. |
| Container terpisah | Container sekali-jalan dari image saat ini dengan env, mount, dan batas sumber daya yang sama; dihapus setelah selesai. | Terisolasi. Tidak terlihat oleh monitoring/notifikasi container mati. |
Butuh state proses yang sedang jalan (cache di memori, sinyal)?→ Di container
Berat, lama, atau tidak boleh mengganggu proses utama (migrasi, batch)?→ Container terpisah
Aplikasi sedang stopped tapi job tetap harus jalan?→ Container terpisah
Membuat job
Buka tab Jobs → Job baru
Field Keterangan Nama Label job. Jadwal (cron) 5 field, mis. 0 3 * * *. Kosongkan untuk job manual saja. Divalidasi saat simpan (400 bila salah).Perintah Dijalankan lewat sh -c— boleh pipe,&&, dan tanda kutip.Target Di container / Container terpisah. Timeout (detik) Default 600. Ditegakkan di dalam container. Jalankan manual untuk mencoba
Klik Jalankan. Riwayat run muncul saat baris job dibuka: status, exit code, durasi, dan output. Halaman menyegarkan tiap 2 detik selama ada run yang berjalan.
Aktifkan jadwal
Toggle aktif di baris job. Jadwal didaftarkan langsung tanpa restart API; zona waktu mengikuti container API (UTC di image distribusi).
Contoh job
| Job | Cron | Perintah | Target |
|---|---|---|---|
| Migrasi DB setelah deploy | (manual) | npm run migrate | Container terpisah |
| Bersihkan file sementara | 0 3 * * * | find /app/tmp -mtime +7 -delete | Di container |
| Laporan harian | 0 7 * * 1-5 | node scripts/report.js | Container terpisah |
| Warm cache tiap 15 menit | */15 * * * * | curl -fsS http://127.0.0.1:3000/warm | Di container |
Cron 5 field
┌─ menit (0-59)
│ ┌─ jam (0-23)
│ │ ┌─ tanggal (1-31)
│ │ │ ┌─ bulan (1-12)
│ │ │ │ ┌─ hari (0-6, 0 = Minggu)
* * * * *
*/15 * * * * tiap 15 menit
0 3 * * * tiap hari 03:00
0 0 * * 0 tiap Minggu 00:00Perilaku
- Tick cron dilewati (tidak antre) bila run sebelumnya masih berjalan. Menjalankan manual saat masih ada run aktif → 409.
- Status run:
success(exit 0) /failed(exit ≠ 0) /timeout. Gagal atau timeout mengirim notifikasijobFailurebila diaktifkan. - Output stdout+stderr disimpan sampai 64 KB per run; 50 run terakhir per job. UI menampilkan 20 terakhir.
- Deploy baru tidak menghentikan run yang sedang berjalan di Container terpisah; run Di container ikut mati bersama container lama.
- Untuk aplikasi mode service (Swarm), target Di container menjalankan exec di task yang ada di host — Engine API tidak bisa exec ke task di node lain.
Cara kerja timeout
Timeout ditegakkan di dalam container lewat perintah timeout (bila ada di image), karena exec tidak bisa dibunuh dari luar. API baru menyerah menunggu setelah timeout + 30 detik.
Image tanpa
timeout (mis. distroless) tidak bisa membatasi durasi: run dianggap timeout hanya setelah API berhenti menunggu, sementara perintah mungkin masih berjalan. Sertakan coreutils atau busybox di image bila job berpotensi lama.Jebakan umum
| Gejala | Penyebab & solusi |
|---|---|
| Run gagal: container not running | Target Di container tapi aplikasi stopped. Pakai Container terpisah atau start aplikasinya. |
| command not found | Image tidak punya binary itu (mis. curl di alpine minimal). Pakai wget, atau tambahkan ke Dockerfile. |
| Jadwal tidak jalan pada jam yang diharapkan | Zona waktu API = UTC. Geser jam di cron (WIB = UTC+7). |
| Job tetap failed padahal perintah sukses | Exit code terakhir ≠ 0 — mis. grep tanpa hasil. Akhiri dengan || true bila memang tidak masalah. |
Belum tersedia
Streaming output saat run berjalan; riwayat lebih dari 20 di UI.
Langkah berikutnya
Ada yang keliru? Edit halaman ini di GitLab ↗