CMD
(Ve RUN
ve ENTRYPOINT
) ' nin json sözdizimi argümanları doğrudan çekirdeğe exec system sall olarak aktarır. Exec çağrısında, komutun boşluklardan bağımsız değişkenlerden ayrılması, tırnakların kaçması, IO yönlendirmeleri, değişkenlerin ikame edilmesi, komutlar arasında borulama, çoklu komutların çalıştırılması vb. Sistem sadece çalıştırılabilir dosyayı çalıştırır ve bu çalıştırılabilir öğeye iletilecek argümanların listesini alır ve çalıştırır.
Karakterler gibi $
, değişkenler genişletmek için ;
ayrı komutlara
ayrı argümanları (boşluk), &&
ve ||
zincir komutlara, >
çıkış yönlendirme için, |
gibi kabuk ve ihtiyaç şeyin tüm özellikleri komutları arasında borusuna vb vardır /bin/sh
ya /bin/bash
yorumlamak ve bunları uygulamaktır.
Dize sözdizimine geçerseniz CMD
, docker komutunuzu bir kabukla çalıştırır:
CMD /etc/init.d/nullmailer start ; /usr/sbin/php5-fpm
Aksi takdirde, ikinci sözdiziminiz de aynı şeyi yapar:
CMD ["sh", "-c", "/etc/init.d/nullmailer start ; /usr/sbin/php5-fpm"]
İlk komutunuz arızalanırsa, özellikle de arka planda çalışıyorsa, herhangi bir hata işleme olmadığından, bir kabın içinde bu şekilde birden fazla komut çalıştırmanın tavsiye edilmediğini unutmayın. Ayrıca, kabın içinde sinyal işlemeyi kıracak, 10 saniyelik bir gecikme ve konteynerin liman işçisi tarafından nezaketsiz öldürülmesiyle sonuçlanan kabın içinde 1 olarak çalışan bir kabuk bırakırsınız. Sinyal işleme, kabuk exec
komutu kullanılarak hafifletilebilir :
CMD /etc/init.d/nullmailer start ; exec /usr/sbin/php5-fpm
Bununla birlikte, arka planda sessizce başarısız olan işlemlerle uğraşmak, süpervizör gibi bir çok işlem yöneticisine geçmenizi veya tercihen uygulamanızı birden çok kapsayıcıya bölmenizi ve bunları docker-compose gibi bir şeyle dağıtmanızı gerektirir.
exec
Tercih edilen form olduğu için hala bu formu kullanmalı mıyım ? Neden tercih edilir? Yoksa daha basitshell
form kullanmalı mıyım?