Mevcut cevaplar, bu soruya bakan herkesin ihtiyaç duyacağı şeylerin çoğunu kapsar. Bu yüzden sadece CMD ve RUN için bazı niş alanları kaplayacağım.
CMD: Kopyalara İzin Veriliyor, Ancak İsraflı
GingerBeer önemli bir noktaya değiniyor: Birden fazla CMD koyarsanız herhangi bir hata almazsınız - ancak bunu yapmak israftır. Bir örnek vermek istiyorum:
FROM busybox
CMD echo "Executing CMD"
CMD echo "Executing CMD 2"
Bunu bir görüntüye dönüştürür ve bu görüntüde bir kap çalıştırırsanız, GingerBeer'ın belirttiği gibi, yalnızca son CMD dikkate alınacaktır. Yani bu kabın çıktısı:
CMD 2'yi yürütme
Bence "CMD" inşa edilen görüntünün tamamı için tek bir global değişken oluşturuyor, bu yüzden birbirini izleyen "CMD" ifadeleri basitçe bu global değişkenin önceki yazılarının üzerine yazıyor ve sonuncusu kazanır. Bir Dockerfile yukarıdan aşağıya doğru sırayla yürütüldüğünden, en alttaki CMD'nin bu son "yazma" yı (mecazi olarak konuşan) aldığını biliyoruz.
RUN: Görüntüler Önbelleğe Alınırsa Komutlar Yürütülmeyebilir
RUN hakkında dikkat edilmesi gereken ince bir nokta, yan etkiler olsa bile saf bir işlev olarak ele alınması ve böylece önbelleğe alınmasıdır. Bunun anlamı, RUN'un sonuçtaki görüntüyü değiştirmeyen bazı yan etkileri varsa ve bu görüntü önceden önbelleğe alınmışsa, RUN tekrar yürütülmez ve bu nedenle sonraki yapılarda yan etkiler olmaz. Örneğin, şu Docker dosyasını alın:
FROM busybox
RUN echo "Just echo while you work"
İlk kez çalıştırdığınızda, farklı alfasayısal kimliklerle böyle bir çıktı alırsınız:
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
Echo ifadesinin yukarıda yürütüldüğüne dikkat edin. İkinci kez çalıştırdığınızda önbelleği kullanır ve yapının çıktısında herhangi bir yankı görmezsiniz:
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