Jawaban yang ada mencakup sebagian besar apa yang dibutuhkan orang yang melihat pertanyaan ini. Jadi saya hanya akan membahas beberapa area khusus untuk CMD dan RUN.
CMD: Duplikat Diizinkan, tapi Boros
GingerBeer membuat poin penting: Anda tidak akan mendapatkan kesalahan jika Anda memasukkan lebih dari satu CMD - tetapi boros untuk melakukannya. Saya ingin menguraikan dengan contoh:
FROM busybox
CMD echo "Executing CMD"
CMD echo "Executing CMD 2"
Jika Anda membuat ini menjadi gambar dan menjalankan wadah di gambar ini, maka seperti yang dinyatakan GingerBeer, hanya CMD terakhir yang akan diperhatikan. Jadi output dari wadah itu adalah:
Menjalankan CMD 2
Cara saya memikirkannya adalah bahwa "CMD" sedang mengatur variabel global tunggal untuk seluruh gambar yang sedang dibangun, sehingga pernyataan "CMD" berturut-turut cukup menimpa setiap tulisan sebelumnya ke variabel global itu, dan pada gambar akhir yang membangun yang terakhir untuk menulis kemenangan. Karena Dockerfile dijalankan secara berurutan dari atas ke bawah, kita tahu bahwa CMD paling bawah adalah yang mendapatkan "tulis" terakhir ini (secara metaforis).
RUN: Perintah Mungkin tidak Jalankan jika Gambar di-cache
Poin halus yang perlu diperhatikan tentang RUN adalah bahwa itu diperlakukan sebagai fungsi murni bahkan jika ada efek samping, dan karenanya di-cache. Artinya, jika RUN memiliki beberapa efek samping yang tidak mengubah gambar yang dihasilkan, dan gambar tersebut telah di-cache, RUN tidak akan dieksekusi lagi sehingga efek samping tidak akan terjadi pada pembuatan berikutnya. Misalnya, ambil Dockerfile ini:
FROM busybox
RUN echo "Just echo while you work"
Pertama kali Anda menjalankannya, Anda akan mendapatkan output seperti ini, dengan ID alfanumerik yang berbeda:
docker build -t example/run-echo .
Sending build context to Docker daemon 9.216kB
Step 1/2 : FROM busybox
---> be5888e67be6
Step 2/2 : RUN echo "Just echo while you work"
---> Running in ed37d558c505
Just echo while you work
Removing intermediate container ed37d558c505
---> 6f46f7a393d8
Successfully built 6f46f7a393d8
Successfully tagged example/run-echo:latest
Perhatikan bahwa pernyataan gema dieksekusi di atas. Kedua kali Anda menjalankannya, ia menggunakan cache, dan Anda tidak akan melihat gema di output build:
docker build -t example/run-echo .
Sending build context to Docker daemon 9.216kB
Step 1/2 : FROM busybox
---> be5888e67be6
Step 2/2 : RUN echo "Just echo while you work"
---> Using cache
---> 6f46f7a393d8
Successfully built 6f46f7a393d8
Successfully tagged example/run-echo:latest