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"]
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.
ENTRYPOINT adalah main command yang selalu dikesekusi ketika container dijalankan. Contoh Dockerfile:
FROM alpine:3.21.3
ENTRYPOINT ["echo", "Hello World"]
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.
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.
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"
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.
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"]
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.
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)