Json sözdizimi CMD
(ve RUN
ve ENTRYPOINT
) argümanları doğrudan çekirdeğe bir exec syscall olarak iletin. Exec syscall'da komutun bağımsız değişkenlerden boşluklarla ayrılması, tırnak işaretlerinden kaçması, GÇ yeniden yönlendirmesi, değişken değiştirme, komutlar arasında geçiş yapma, birden çok komut çalıştırma vb. Yoktur. Syscall yalnızca yürütülebilir dosyayı çalıştırmak ve bu yürütülebilir dosyaya geçirilecek bağımsız değişkenlerin listesini alır ve çalıştırır.
Gibi karakterler $
değişkenleri genişletmek için, ;
komutları ayırmak için,
(boşluk) bağımsız değişkenleri ayırmak için, &&
ve ||
komutları zincirlemek için, >
çıktı yeniden yönlendirmesi için, |
komutlar arasında geçiş yapmak vb. Kabuğun tüm özellikleridir ve aşağıdaki gibi bir şeye ihtiyaç duyar /bin/sh
veya /bin/bash
bunları yorumlamak ve uygulamak.
Dize sözdizimine geçerseniz CMD
, docker komutunuzu bir kabuk ile çalıştıracaktır:
CMD /etc/init.d/nullmailer start ; /usr/sbin/php5-fpm
Aksi takdirde, ikinci sözdiziminiz aynı şeyi yapar:
CMD ["sh", "-c", "/etc/init.d/nullmailer start ; /usr/sbin/php5-fpm"]
İlk komutunuz başarısız olursa, özellikle arka planda çalışıyorsa, hata işleme olmadığından, bir kapsayıcı içinde bu şekilde birden çok komut çalıştırmanızı önermediğimi unutmayın. Ayrıca, kabın içinde pıd 1 olarak çalışan bir kabuk bırakırsınız, bu da sinyal işlemeyi kıracak ve 10 saniyelik bir gecikmeye ve konteynerinizin docker tarafından nankör bir şekilde öldürülmesine neden olacaktır. Sinyal işleme, kabuk kullanılarak hafifletilebilir exec
komut:
CMD /etc/init.d/nullmailer start ; exec /usr/sbin/php5-fpm
Bununla birlikte, arka planda sessizce başarısız olan işlemleri işlemek, supervisord gibi bir tür çoklu işlem yöneticisine geçmenizi veya tercihen uygulamanızı birden çok kapsayıcıya ayırmanızı ve bunları docker-compose gibi bir şeyle dağıtmanızı gerektirir.