Jika Anda pernah perlu menjalankan satu atau dua perintah di wadah Docker Anda saat startup, tutorial ini cocok untuk Anda. Menggunakan ENTRYPOINT
Dockerfile dan CMD
petunjuk, Anda dapat menjalankan perintah startup sebanyak yang Anda mau.
Dalam tutorial ini, Anda akan mempelajari cara menggunakan ENTRYPOINT
dan CMD
instruksi untuk menjalankan perintah startup di Dockerfile dan memahami perbedaannya.
Prasyarat
Karena tutorial ini akan menjadi demonstrasi langsung, pastikan Anda memiliki yang berikut ini:
- PC Windows 10 – Windows 10 v10.0.19042 digunakan dalam tutorial ini.
- Desktop Docker – Tutorial ini menggunakan Docker Desktop v3.3.1.
Membuat Dockerfile
Sebelum Anda dapat menjalankan perintah startup container Docker, Anda harus membuat Dockerfile terlebih dahulu. Dockerfile adalah dokumen teks yang berisi daftar perintah untuk membuat container, image Docker, dan menentukan bagaimana image Docker dibuat.
1. Pertama, buka PowerShell sebagai administrator.
2. Buat folder baru untuk menyimpan Dockerfile dan semua file terkait tutorial ini akan digunakan dan diubah ke direktori itu. Tutorial ini menggunakan ~/docker .
mkdir ~/docker
cd docker
3. Sekarang, buat file teks kosong bernama Dockerfile dengan perintah berikut.
cd > Dockerfile
Atau, Anda dapat membuat Dockerfile dengan perintah berikut jika Anda menggunakan Linux atau Mac OS.
touch Dockerfile
4. Terakhir, tambahkan konten berikut ke dalam Dockerfile
FROM ubuntu:20.04
Anda sekarang telah membuat Dockerfile yang akan segera hadir!
Membangun Gambar Docker
Sekarang setelah Anda membuat Dockerfile, Anda harus membuat image Docker untuk menjalankan perintah yang tertulis dalam instruksi ENTRYPOINT dan CMD Dockerfile Anda. Salah satu cara untuk membuat gambar adalah dengan menggunakan build
perintah.
Saat berada di ~/docker direktori, jalankan perintah berikut. Perintah di bawah ini membuat gambar Docker bernama demo (-t demo
) dari Dockerfile di ~/docker dengan menentukan direktori kerja saat ini (.
).
docker build -t demo .
Menjalankan Kontainer Docker
Setelah membuat image Docker, Anda memerlukan wadah untuk menjalankan image Docker yang akan menjalankan perintah dari instruksi Dockerfile ENTRYPOINT dan CMD.
Untuk menjalankan wadah Docker, aktifkan run
perintah untuk membuat lapisan wadah yang dapat ditulisi di atas gambar Docker (demo
). Contoh di bawah ini menggunakan -it
parameter untuk terhubung secara interaktif ke penampung sehingga Anda dapat melihat output sampel.
docker run -it demo
Exec vs. Formulir Shell
Saat Anda mulai bekerja dengan Dockerfile dan mencari tahu cara menjalankan perintah startup, Anda mungkin menemukan dua metode berbeda untuk mendefinisikan perintah ini. Setiap metode akan memanggil perintah tetapi melakukannya dengan cara yang sedikit berbeda.
Ketika Docker mengeksekusi perintah, ia dapat melakukannya secara langsung yang disebut exec
atau buka cangkang wadah (/bin/sh -c
di Linux atau cmd /S /C
di Windows) disebut shell
.
Anda akan melihat perintah dijalankan melalui exec
memiliki instruksi yang diikuti oleh executable untuk dipanggil diikuti oleh satu atau lebih argumen baris perintah, seperti yang ditunjukkan di bawah ini.
ENTRYPOINT ["executables", "parameter1", "parameter2", ...]
CMD ["executables", "parameter1", "parameter2:, ...]
Menulis perintah di shell
form, di sisi lain, tidak memerlukan perintah membungkus dalam tanda kurung siku, seperti yang ditunjukkan di bawah ini.
ENTRYPOINT <command> "parameter1"
CMD <command> "parameter1"
Jika Anda tidak menentukan argumen ke
CMD
, Docker akan selalu menjalankan perintah dalam bentuk exec mis.CMD <command>
.
Jika Anda baru memulai, membedakan antara dua pemanggilan perintah ini tidak akan terlalu menjadi masalah, tetapi saat Anda semakin mahir, Anda akan segera melihat manfaat dan kekurangannya masing-masing.
Menjalankan Perintah Memulai
Sekarang mari kita masuk ke inti tutorial ini dan membuat tangan Anda kotor dengan berjalan melalui beberapa contoh menjalankan perintah startup dalam ENTRYPOINT
Dockerfile dan instruksi CMD.
1. Buka Dockerfile yang Anda buat sebelumnya di editor teks pilihan Anda.
2. Salin dan tempel contoh konten Dockerfile ke dalam Dockerfile Anda, seperti yang ditunjukkan di bawah ini, dan simpan.
Dockerfile ini membuat lapisan menggunakan ubuntu:20.04
sebagai gambar dasar. Kemudian memberitahu Docker untuk memanggil echo
perintah yang meneruskan Hello world
argumen untuk keduanya Dockerfile CMD
dan ENTRYPOINT
instruksi menggunakan exec
dan shell
membentuk.
FROM ubuntu:20.04
# CMD Instruction
CMD ["echo", "Hello world"] # Exec Form
CMD echo "Hello world" # Shell Form
# ENTRYPOINT Instruction
ENTRYPOINT ["echo", "Hello world"] # Exec Form
ENTRYPOINT echo "Hello world" # Shell Form
3. Saat berada di ~/docker direktori, buat gambar baru dengan menjalankan docker build
dan beri nama demo
. Perintah di bawah tag gambar sebagai demo
dan mencari Dockerfile di direktori kerja saat ini (.
).
docker build -t demo .
4. Sekarang, jalankan container menggunakan image kemudian jalankan container Docker berdasarkan image Docker yang dibuat sebelumnya. Sekarang Anda akan melihat bahwa wadah mengembalikan Hello world
yang berasal dari CMD
instruksi yang disediakan di Dockerfile.
docker run -it demo
Menggunakan Variabel dalam Dockerfile
Terkadang Anda mungkin tidak mengetahui argumen baris perintah yang tepat untuk diteruskan ke perintah sebelumnya. Argumen yang perlu Anda teruskan ke perintah hanya diekspos saat runtime. Daripada menetapkan argumen perintah secara statis, Anda dapat menangkap dan meneruskan argumen tersebut ke perintah dengan variabel.
Anda hanya dapat menggunakan variabel Dockerfile di
shell
membentuk. Docker tidak mendukung variabel dalam perintah yang dipanggil melaluiexec
formulir.
Buka lagi Dockerfile di editor teks pilihan Anda, ganti semua yang ada di dalamnya dengan rangkaian perintah berikut dan simpan.
Anda akan melihat kali ini, Dockerfile menggunakan variabel lingkungan dan ditampilkan menggunakan ENV
. Pada contoh di bawah, Dockerfile mendefinisikan variabel lingkungan yang disebut name
dengan nilai friend
. Setelah dibuat, variabel lingkungan ini kemudian dirujuk melalui $name
.
Ketika Docker menjalankan sebuah wadah berdasarkan Dockerfile ini, ia akan memanggil echo
perintah dan berikan argumen Welcome, friend
.
FROM ubuntu:20.04
ENV name friend
CMD echo "Welcome, $name"
# or
## ENTRYPOINT echo "Welcome, $name"
Sekarang, buat image Docker dan jalankan container lagi secara opsional dengan memberikan nama tag shellform
. Anda akan melihat bahwa Docker memanggil echo
perintah dan mengembalikan output yang diharapkan.
Menggabungkan Dockerfile ENTRYPOINT dan Instruksi CMD
Sebagian besar waktu, Anda akan menjalankan perintah startup baik dalam instruksi CMD atau ENTRYPOINT. Lagi pula, Anda dapat menjalankan perintah sebanyak yang Anda inginkan menggunakan setiap metode. Namun, Anda juga dapat menjalankan satu perintah dan “membangunnya” menggunakan kedua instruksi tersebut.
Berdasarkan contoh sebelumnya, mungkin Anda memiliki Dockerfile yang terlihat seperti contoh di bawah ini. Apa adanya, jika Anda membuat gambar dan menjalankan wadah dari gambar itu, Docker akan memanggil echo
perintah dan kembalikan Hello
.
FROM ubuntu:20.04
ENTRYPOINT ["echo", "Hello"]
Mungkin Anda memiliki argumen lain yang ingin Anda sampaikan ke echo
perintah tetapi tidak segera. Mungkin Anda ingin melakukannya lebih jauh di Dockerfile. Dengan memanggil CMD
instruksi tanpa perintah, Anda dapat melakukannya.
Bila Anda menentukan perintah untuk dijalankan melalui
ENTRYPOINT
instruksi diikuti olehCMD
instruksi, Docker secara otomatis mengasumsikan nilai yang diteruskan keCMD
adalah argumen; bukan perintah.
Sekarang, tambahkan CMD
referensi instruksi tanpa perintah, hanya argumen yang disebut world
, seperti yang ditunjukkan di bawah ini.
FROM ubuntu:20.04
ENTRYPOINT ["echo", "Hello"]
CMD ["world"]
CInstruksi penggabungan harus selalu ditulis dalam bentuk exec karena perilaku "seperti array" dalam menentukan nilai yang dipisahkan oleh koma vs semua dalam satu string.
Setelah membuat image dan menjalankan container dari image, Anda dapat melihat bahwa alih-alih dua baris output (Hello
dan world
), Docker hanya mengembalikan satu arti hanya satu echo
pemanggilan perintah.
Kesimpulan
Anda sekarang harus memiliki pemahaman yang baik tentang menjalankan perintah startup kontainer Docker melalui CMD
dan ENTRYPOINT
instruksi Dockerfile. Setiap instruksi sedikit berbeda tetapi menyelesaikan tugas yang sama dan bahkan dapat digunakan bersama.
Dapatkah Anda memikirkan skenario di mana Anda lebih suka menggunakan CMD
lebih dari ENTRYPOINT
untuk menjalankan perintah startup?