La syntaxe json de CMD
(et RUN
y ENTRYPOINT
) passent les arguments au noyau directement comme un syscall exec. Il n'y a pas de séparation de la commande des arguments par des espaces, d'échappement des guillemets, de redirection d'E/S, de substitution de variable, de tuyauterie entre les commandes, d'exécution de commandes multiples, etc. dans l'appel système d'exécution. Le syscall prend seulement l'exécutable à exécuter et la liste des arguments à passer à cet exécutable, et il l'exécute.
Des personnages comme $
pour développer les variables, ;
pour séparer les commandes, (espace) pour séparer les arguments, &&
y ||
à la chaîne de commandement, >
pour la redirection des sorties, |
pour passer d'une commande à l'autre, etc., sont toutes des caractéristiques du Shell et requièrent quelque chose comme /bin/sh
o /bin/bash
pour les interpréter et les mettre en œuvre.
Si vous passez à la syntaxe de chaîne de caractères de CMD
, docker exécutera votre commande avec un Shell :
CMD /etc/init.d/nullmailer start ; /usr/sbin/php5-fpm
Sinon, votre deuxième syntaxe fait exactement la même chose :
CMD ["sh", "-c", "/etc/init.d/nullmailer start ; /usr/sbin/php5-fpm"]
Notez que je ne recommande pas d'exécuter plusieurs commandes de cette façon à l'intérieur d'un conteneur car il n'y a pas de gestion des erreurs si votre première commande échoue, surtout si elle s'exécute en arrière-plan. Vous laissez également un Shell s'exécuter en tant que pid 1 à l'intérieur du conteneur, ce qui brisera la gestion des signaux, ce qui entraînera un délai de 10 secondes et un kill non gracieux de votre conteneur par docker. La gestion des signaux peut être atténuée en utilisant le Shell. exec
commandement :
CMD /etc/init.d/nullmailer start ; exec /usr/sbin/php5-fpm
Cependant, pour gérer les processus qui échouent silencieusement en arrière-plan, il faut passer à une sorte de gestionnaire multi-processus comme supervisord, ou de préférence décomposer votre application en plusieurs conteneurs et les déployer avec quelque chose comme docker-compose.