Składnia JSON CMD(a RUNi ENTRYPOINT) przekazywać argumenty do jądra bezpośrednio jako exec syscall. Nie ma oddzielania polecenia od argumentów spacjami, unikania cudzysłowów, przekierowywania IO, podstawiania zmiennych, łączenia między poleceniami, uruchamiania wielu poleceń itp. W syscall exec. Syscall pobiera tylko plik wykonywalny do uruchomienia i listę argumentów przekazywanych do tego pliku wykonywalnego i uruchamia go.
Znaki takie jak $rozszerzanie zmiennych, ;oddzielanie poleceń, (spacja) oddzielanie argumentów &&i ||łączenie poleceń, >przekierowywanie danych wyjściowych |, przechodzenie między poleceniami itp., Są cechami powłoki i wymagają czegoś podobnego /bin/shlub /bin/bashich interpretacji i implementacji.
Jeśli przełączysz się na składnię ciągu CMD, doker wykona polecenie z powłoką:
CMD /etc/init.d/nullmailer start ; /usr/sbin/php5-fpm
W przeciwnym razie druga składnia robi dokładnie to samo:
CMD ["sh", "-c", "/etc/init.d/nullmailer start ; /usr/sbin/php5-fpm"]
Zauważ, że nie polecam wykonywania wielu poleceń w ten sposób w kontenerze, ponieważ nie ma obsługi błędów, jeśli pierwsze polecenie nie powiedzie się, szczególnie jeśli działa w tle. Zostawiasz również powłokę działającą jako pid 1 wewnątrz kontenera, co przerwie obsługę sygnału, co spowoduje 10-sekundowe opóźnienie i niesforne zabicie twojego kontenera przez dokera. Obsługę sygnałów można złagodzić za pomocą execpolecenia powłoki :
CMD /etc/init.d/nullmailer start ; exec /usr/sbin/php5-fpm
Jednak obsługa procesów, które cicho zawodzą w tle, wymaga przejścia do jakiegoś menedżera wieloprocesowego, takiego jak nadzór, lub najlepiej rozbicia aplikacji na wiele kontenerów i wdrożenia ich z czymś w rodzaju dokowania-komponowania.
execformularza, ponieważ jest to preferowany? Dlaczego jest to preferowane? Czy powinienem użyć prostszegoshellformularza?