Dans votre premier exemple, vous donnez le -c
indicateur à docker exec
. C'est une réponse facile :docker exec
n'a pas de -c
drapeau.
Dans votre deuxième exemple, votre shell analyse cela en deux commandes avant même que Docker ne le voie. Cela équivaut à ceci :
if docker exec [id] cd /var/www/project
then
composer install
fi
Tout d'abord, le docker exec
est exécuté, et s'il sort 0 (succès), composer install
va essayer de s'exécuter localement , en dehors de Docker.
Ce que vous devez faire est de passer les deux commandes en tant qu'argument unique à docker exec
à l'aide d'une chaîne. Ensuite, ils ne seront pas interprétés par un shell tant qu'ils ne seront pas déjà à l'intérieur du conteneur.
docker exec [id] "cd /var/www/project && composer install"
Cependant, comme vous l'avez noté dans les commentaires, cela ne fonctionne pas non plus. C'est parce que cd
est un shell intégré et n'existe pas en soi. Essayer de l'exécuter en tant que commande initiale échouera. La prochaine étape consiste donc à transmettre cela à un shell pour qu'il l'exécute.
docker exec [id] "bash -c 'cd /var/www/project && composer install'"
Et enfin, à ce stade, le &&
est passé à un ensemble interne de guillemets, nous n'avons donc pas vraiment besoin des guillemets autour du bash
commande... vous pouvez les supprimer si vous préférez.
docker exec [id] bash -c 'cd /var/www/project && composer install'
Tout après l'identifiant du conteneur est la commande à exécuter, donc dans le premier exemple -c
n'est pas une option pour exec, mais un docker de commande essaie de s'exécuter et échoue car cette commande n'existe pas.
Vous avez très probablement trouvé cette syntaxe à partir d'un docker run
commande où le point d'entrée était défini sur /bin/sh
. Cependant, exec contourne le point d'entrée, vous devez donc inclure la commande complète à exécuter. Comme d'autres l'ont souligné, cette commande inclut un shell comme bash ou dans l'exemple ci-dessous, sh :
docker exec [id] /bin/sh -c 'cd /var/www/project && composer install'