Kebijakan Restart

Perilaku no, on-failure, always, dan unless-stopped, serta pilihan yang tepat untuk layanan produksi.

Daftar isi

Topik ini membahas kebijakan restart, yaitu aturan yang menentukan kapan Docker menghidupkan ulang container secara otomatis. Pembahasan mencakup empat nilai opsi --restart, perbandingan perilakunya saat container berhenti maupun saat Docker dimulai ulang, pemilihan kebijakan untuk layanan produksi, serta bentuk yang sama pada Compose. Setelah membacanya, container layanan dapat pulih sendiri tanpa campur tangan manual setiap kali prosesnya berhenti.

Fungsi kebijakan restart#

Proses di dalam container dapat berhenti karena dua sebab yang lazim, yaitu aplikasi yang mengalami error atau host yang dimulai ulang, yakni mesin tempat Docker berjalan. Tanpa kebijakan restart, container yang berhenti karena sebab mana pun dibiarkan berhenti, dan aplikasi hanya hidup kembali setelah perintah docker start dijalankan secara manual. Kondisi itu wajar untuk container uji coba, tetapi tidak wajar untuk layanan yang diharapkan terus tersedia.

Kebijakan restart adalah instruksi tetap yang diberikan kepada daemon, yaitu proses latar Docker yang mengelola seluruh container, agar menghidupkan ulang container mengikuti aturan tertentu. Kebijakannya ditetapkan melalui opsi --restart pada docker run dan tersimpan bersama konfigurasi container, sehingga tidak perlu diulang setiap kali container dijalankan. Nilai bawaannya adalah no, yang berarti tidak ada pemulihan otomatis sama sekali.

Empat nilai opsi –restart#

Empat nilai yang diterima --restart berbeda pada dua keadaan kunci, yaitu saat container berhenti karena kesalahannya sendiri dan saat daemon dimulai ulang. Tabel berikut merangkum perbedaannya.

NilaiContainer berhenti sendiriDaemon dimulai ulangCatatan
noTetap berhentiTetap berhentiNilai bawaan, tanpa pemulihan otomatis
on-failureDihidupkan ulang hanya bila kode keluarnya bukan nolContainer yang sedang berjalan dihidupkan ulangBentuk on-failure:N membatasi jumlah percobaan
alwaysSelalu dihidupkan ulangSemua container dihidupkan ulang, termasuk yang sebelumnya dihentikan manualDiperuntukkan bagi container yang harus selalu hidup
unless-stoppedDihidupkan ulang tanpa memandang kode keluarHanya container yang tidak dihentikan manualMirip always dengan pengecualian pada penghentian manual

Perbedaan always dan unless-stopped hanya terlihat pada satu keadaan, yaitu container yang dihentikan secara manual lalu daemon dimulai ulang. Kebijakan always menjalankan kembali container tersebut, sedangkan unless-stopped menghormati keputusan penghentian itu dan membiarkannya berhenti. Pada daemon yang terus berjalan, container yang dihentikan manual tidak dihidupkan ulang oleh kedua kebijakan tersebut, sehingga pemeliharaan yang disengaja tetap aman dilakukan.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# layanan catatan pulih sendiri, kecuali dihentikan manual
docker run -d --restart unless-stopped --name catatan-app catatan
# pekerjaan cadangan hanya diulang saat gagal, maksimal tiga kali
docker run --rm --restart on-failure:3 --name cadangan-harian image-cadangan

Kebijakan on-failure membedakan kegagalan dari penghentian yang wajar. Container yang prosesnya berakhir dengan kode keluar nol dibiarkan berhenti, sedangkan kode keluar lain memicu penghidupan ulang, sehingga pola ini cocok untuk pekerjaan berjeda yang seharusnya selesai dan tidak berputar terus. Batas percobaan pada on-failure:N mencegah pekerjaan yang selalu gagal diulang tanpa akhir.

Memilih kebijakan untuk layanan#

Layanan produksi yang harus terus tersedia paling tepat diberi kebijakan unless-stopped. Pilihan ini memulihkan layanan dari error mendadak maupun dari dimulai ulangnya host, tetapi tetap menghormati penghentian manual saat pemeliharaan dilakukan. Kebijakan always hanya dipilih bila container memang harus hidup dalam keadaan apa pun, termasuk setelah dihentikan manual, dan hal itu jarang menjadi kebutuhan yang sungguh-sungguh.

Kebijakan restart hanya berlaku setelah container berhasil dimulai, yang ditandai dengan container yang bertahan hidup paling sedikit sepuluh detik. Aturan ini mencegah container yang gagal sejak awal berputar dalam penghidupan ulang tanpa akhir. Meski demikian, aturan itu tidak menutup kemungkinan kegagalan yang muncul setelah masa sepuluh detik tersebut, sehingga pemantauan log tetap diperlukan.

Kebijakan restart pada Compose#

Pada Compose, peran --restart diambil alih oleh kunci restart: pada berkas compose.yaml. Kunci itu dituliskan pada tingkat service dan menerima keempat nilai yang sama dengan docker run, sehingga kebijakan yang selama ini diberikan lewat perintah cukup dinyatakan sekali di dalam berkas. Kebijakan pada berkas membuat pemulihan otomatis ikut aktif tanpa opsi tambahan saat proyek dijalankan.

yaml
services:
  app:
    image: catatan
    restart: unless-stopped

Saat Compose menjalankan proyek, kebijakan pada kunci tersebut diterapkan ke container milik service yang bersangkutan, sehingga perilaku pemulihannya identik dengan opsi --restart pada docker run. Nilai yang tertulis di berkas juga terbaca dan dapat disunting seperti bagian konfigurasi lainnya, yang membuat kebijakan pemulihan ikut terdokumentasi bersama sisa konfigurasi aplikasi. Perilaku setiap nilai tetap mengikuti tabel pada bagian sebelumnya.

Kesalahan umum#

  1. Container gagal dipulihkan terus-menerus. Aplikasi yang langsung berhenti karena konfigurasinya salah, misalnya POSTGRES_PASSWORD yang kosong, akan dihidupkan ulang lalu berhenti lagi berulang-ulang apabila kebijakannya always. Lognya menumpuk pesan error yang sama, dan tanda-tandanya terlihat pada docker ps -a sebagai container yang baru saja dimulai ulang. Perbaikannya dengan membaca log sampai penyebab awalnya ditemukan, bukan dengan menambah percobaan ulang.

  2. Mengira kebijakan mengalahkan penghentian manual. Container yang dihentikan dengan docker stop tidak dihidupkan ulang selama daemon masih berjalan, sebagaimana pun kebijakannya. Harapan bahwa kebijakan always langsung menyalakan kembali container yang baru dihentikan menimbulkan kesimpulan keliru bahwa kebijakannya rusak. Perbaikannya dengan menjalankan docker start secara manual atau menunggu daemon dimulai ulang sesuai perilaku yang tertuang pada tabel di atas.

Ringkasan#

  • Kebijakan restart ditetapkan dengan --restart dan menyuruh daemon menghidupkan ulang container mengikuti aturan yang tersimpan bersama container.
  • on-failure hanya bereaksi pada kode keluar bukan nol dengan batas percobaan opsional, sedangkan always dan unless-stopped menghidupkan ulang tanpa memandang kode keluar.
  • Perbedaan always dan unless-stopped terletak pada container yang dihentikan manual, yang dijalankan kembali oleh always saat daemon dimulai ulang dan dibiarkan oleh unless-stopped.
  • Pada Compose, kebijakan yang sama dinyatakan melalui kunci restart: pada compose.yaml.

Referensi#