DEV Community

Ra
Ra

Posted on

CMD vs ENTRYPOINT: Ini bukan cuma masalah selera, pahami perbedaanya!

Ketika kita membuat suatu docker image, biasanya kita akan menggunakan command CMD atau ENTRYPOINT untuk menjalankan aplikasi yang kita build. Keduanya terlihat mirip, tetapi apakah keduanya memiliki perbedaan? pada kesempatan kali ini saya akan membahas perbedaan antara command CMD dan ENTRYPOINT dengan cara sederhana. Menggunakan contoh docker image berbasis Alpine dengan command yang familiar dan banyak digunakan oleh kebanyakan orang. Semoga tulisan saya kali ini bisa membantu menjawab pertanyaan kapan harus menggunakan CMD atau ENTRYPOINT, atau mengapa perintah dalam container yang kita buat tidak berjalan seperti yang diharapkan, mari kita mulai. 🚀

Apa itu CMD dan ENTRYPOINT?

CMD pada dasarnya adalah default command dan argument yang selalu dijalankan ketika conainer dijalankan. Contoh Dockerfile:

FROM alpine:3.21.3
CMD ["echo", "Hello World"]
Enter fullscreen mode Exit fullscreen mode

Build dengan menggunakan command docker build -t hello-world:cmd . dan jalankan docker image yang sudah di-build tadi dengan command docker run hello-world:cmd maka outputnya akan seperti ini.

basic output cmd

ENTRYPOINT adalah main command yang selalu dikesekusi ketika container dijalankan. Contoh Dockerfile:

FROM alpine:3.21.3
ENTRYPOINT ["echo", "Hello World"]
Enter fullscreen mode Exit fullscreen mode

Build dengan mengunakan command docker build -t hello-world:entrypoint . dan jalankan docker image yang sudah di-build tadi dengan command docker run hello-world:entrypoint maka outputnya akan seperti ini.

basic output entrypoint

Nah sekarang apa yang membedakan antara CMD dan ENTRYPOINT? jika kita lihat ketika menjalankan kedua docker image tersebut menghasilkan output yang sama. Mari kita bahas lebih lanjut.

Perbedaan CMD dan ENTRYPOINT

CMD: jika pengguna memberikan perintah saat menjalankan container, default command tersebut bisa digantikan dengan command yang diberikan ketika menjalankan container.

ENTRYPOINT: jika pengguna memberikan perintah saat menjalankan container, main command tersebut tidak bisa digantikan dengan command yang diberikan ketika menjalankan container.

Bayangkan CMD adalah kendaraan kantor yang sudah disediakan juga supirnya. Pada dasarnya, kendaraan kantor tersebut memiliki destinasi default (command default) seperti dari kantor pusat ke kantor cabang, namun ditengah-tengah jalan bisa kita ubah destinasinya (command default), seperti mampir untuk makan dulu misalnya. Dari analogi ini bisa disimpulkan bahwa command default pada CMD ini bisa di-override saat menjalakan container.

Nah sekarang bayangkan ENTRYPOINT adalah kendaraan umum. Pada dasarnya, kendaraan umum tersebut kan sudah memiliki rutenya tersendiri (main command) seperti dari Daerah A ke Daerah B misalnya dan kita tentu tidak bisa merubah rute (main command) kendaraan umum tersebut dengan sesuka hati. Dari analogi ini, bisa disimpulkan bahwa main command pada ENTRYPOINT ini tidak bisa di-override saat menjalankan container.

Agar bisa dipahami lebih dalam, berikut adalah beberapa contoh dari penggunaan CMD pada docker. Jika kita tetap menggunakan docker image yang kita build sebelumnya untuk CMD dan ingin melakukan override pada default command dengan menjalankan command docker run hello-world:cmd "new message" dengan harapan akan mengeluarkan output berupa pesan “new message” maka outputnya akan seperti ini.

error penggunaan cmd command

mengapa error ini terjadi? ketika kita menjalankan command docker run hello-world:cmd "new message" maka ini akan diterjemahkan menjadi CMD [”new message”] pada Dockerfile kita. Karena “new message” bukanlah sebuah executable di dalam container atau linux command maka akan muncul error tersebut.

Jika kita ingin mengubah output “Hello World” menjadi “new message”, maka command yang harus dijalankan adalah docker run hello-world:cmd "echo" "new message"

hasil koreksi penggunaan cmd command

mengapa tidak error? karena ketika command tersebut dijalankan akan diterjemahkan menjadi CMD [”echo”, “new message”].

Sekarang, kita lanjut ke contoh ENTRYPOINT pada docker. Jika kita menjalankan command docker run hello-world:entrypoint "new message" pada docker image ENTRYPOINT yang kita build sebelumnya, maka output-nya akan seperti ini.

error penggunaan entrypoint command

mengapa hal ini bisa terjadi? karena main command dari ENTRYPOINT tersebut tidak bisa ter-override dan akan diterjemahkan menjadi ENTRYPOINT [”echo”, “Hello World”, “new message”].

Bagaimana jika kita ingin menjalankan command docker run <docker-image-name:tag> "new message" tetapi output yang diharapkan adalah “new message”? jawabannya kombinasikan keduanya antara CMD dengan ENTRYPOINT. Berikut adalah contoh Dockerfile hasil modufikasi kombinasi keduanya.

FROM alpine:3.21.3
ENTRYPOINT ["echo"]
CMD ["Hello World"]
Enter fullscreen mode Exit fullscreen mode

Build menjadi docker image dengan command docker build -t hello-world:combined . lalu jalankan command docker run hello-world:combined "new message" maka output yang akan dihasilkan akan seperti ini.

hasil koreksi penggunaan entrypoint command

output sudah seperti yang diharapkan kan?

Kesimpulan

  • Gunakan CMD jika ingin default command bisa digantikan dengan command yang diberikan ketika menjalankan container.
  • Gunakan ENTRYPOINT jika ingin main command tidak bisa digantikan dengan command yang diberikan ketika menjalankan container.
  • Jika ingin kombinasi antara main command dan default command, maka gunakan keduanya.

Top comments (0)