Dockerfile dosyasında RUN ve CMD arasındaki fark


Yanıtlar:


427

RUN bir görüntü oluşturma adımıdır, RUNkonteynır görüntüsüne bir komut verildikten sonra konteynerin durumu . Dockerfile dosyasında birçokRUN , görüntüyü oluşturmak için üst üste katmanlaşan adım .

CMD , yerleşik görüntüyü başlattığınızda kabın varsayılan olarak yürüttüğü komuttur. Dockerfile yalnızca CMDtanımlanmış olanı kullanır . CMDBir kap ile başlatırken kılınabilirdocker run $image $other_command .

ENTRYPOINT ayrıca CMDbir kabın görüntüyü başlatma biçimiyle yakından ilişkilidir ve değiştirebilir.


15
RUNortamınızı kurmak için gereken her şeyi yaparsınız ve (sadece) CMD'niz konteynerinizde çalışan işlemi başlatır, örneğin, nginx için github.com/nginxinc/docker-nginx/blob/… satırını görürsünüzCMD ["nginx", "-g", "daemon off;"]
user2915097

"Dockerfile dosyası yalnızca bir CMD'ye sahip olabilir" - teknik olarak doğru değil, ancak etkili olanı hariç tümü yok sayılır. GingerBeer'ın cevabına bakınız.
Colm Bhandal

"Dockerfile yalnızca tanımlanan son CMD'yi kullanır"? aslında, tanımlanan son CMD görüntüyü bir kapsayıcı olarak başlatmak için kullanılacak, değil mi?
paul cheung

1
Yes @paulcheung dockerfile içindeki son komut görüntüye yazılır ve yerleşik görüntüyü başlattığınızda kabın varsayılan olarak yürüttüğü komuttur.
Matt

126

RUN - docker görüntüsünü oluştururken komut tetiklenir.

CMD - oluşturulan docker görüntüsünü başlatırken komut tetiklenir.


67

Bu makaleyi aralarındaki farkı anlamak için çok yararlı buldum :

RUN - RUN komutu uygulamanızı ve bunun için gerekli paketleri kurmanıza olanak tanır. Geçerli görüntünün üstünde tüm komutları yürütür ve sonuçları yerine getirerek yeni bir katman oluşturur. Genellikle bir Dockerfile içinde birden fazla RUN talimatı bulacaksınız.

CMD - CMD komutu, yalnızca bir komut belirtmeden kap çalıştırdığınızda yürütülecek olan varsayılan bir komut ayarlamanıza olanak tanır. Docker kapsayıcısı bir komutla çalışırsa, varsayılan komut yok sayılır. Dockerfile uygulamasında birden fazla CMD talimatı varsa, son
CMD komutları hariç tümü göz ardı edilir.


13

RUN - Python'u yükleyin, konteyneriniz artık görüntüsüne python yanmış
CMD - python hello.py, en sevdiğiniz komut dosyasını çalıştırın


CMD - Python'u yükle, konteynırım şimdi görüntüsüne yanmış python mu?
Carlos Fontes

RUN bir python görüntü katmanı yaratacak, CMD sadece görüntü yaratma komutunu
uygulayacak

8

RUN Komutu: RUN komutu, görüntüyü oluştururken temel olarak varsayılan komutu yürütür. Ayrıca bir sonraki adım için görüntü değişikliklerini gerçekleştirecektir.

Yeni bir görüntü oluşturma sürecine yardımcı olmak için 1'den fazla RUN komutu olabilir.

CMD Komutu: CMD komutları yeni kapsayıcı için varsayılan komutu ayarlayacaktır. Bu, derleme sırasında yürütülmez.

Bir docker dosyasında 1'den fazla CMD komutu varsa, sonuncusu hariç tümü yok sayılır. Bu komut hiçbir şey yürütmeyeceğinden, sadece varsayılan komutu ayarlayın.



4

RUN : Çok sayıda olabilir ve derleme işleminde kullanılır , örneğin birden çok kitaplık yükleme

CMD : Yalnızca 1, yürütme başlangıç ​​noktanız olabilir (ör ["npm", "start"]. ["node", "app.js"])


2

RUN ve CMD hakkında yeterli cevap verilmiştir . ENTRYPOINT üzerine birkaç kelime eklemek istiyorum . CMD ise argümanlar, komut satırı argümanları ile üzerine yazılır olabilir entrypoint argümanlar hep kullanılmaktadır.

Bu makale iyi bir bilgi kaynağıdır.


2

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.