Składnia JSON CMD
(a RUN
i 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/sh
lub /bin/bash
ich 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ą exec
polecenia 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.
exec
formularza, ponieważ jest to preferowany? Dlaczego jest to preferowane? Czy powinienem użyć prostszegoshell
formularza?