web-dev-qa-db-fra.com

Exécuter deux commandes avec le docker exec

J'essaie de faire deux commandes dans Docker exec. Concrètement, je dois exécuter une commande dans un répertoire spécifique ..__J'ai essayé, mais cela n'a pas fonctionné:

docker exec [id] -c 'cd /var/www/project && composer install'

Le paramètre -c n'est pas détecté . J'ai aussi essayé ceci:

docker exec [id] cd /var/www/project && composer install

Mais la commande composer install est exécutée après la docker exec commande . Comment puis-je le faire?

13
BraveAdmin

Dans votre premier exemple, vous attribuez l'indicateur -c à docker exec. C'est une réponse facile: docker exec n'a pas d'indicateur -c.

Dans votre deuxième exemple, votre shell analyse cela en deux commandes avant même que Docker ne le voie. C'est équivalent à 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 quitte 0 (succès), composer install essaiera d’exécuter localement en dehors de Docker.

Ce que vous devez faire est de transmettre les deux commandes sous la forme d'un seul argument à docker exec à l'aide d'une chaîne. Ensuite, ils ne seront pas interprétés par un Shell tant qu'ils ne sont pas déjà dans le 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. En effet, cd est un shell intégré et n’existe pas par lui-même. Essayer de l'exécuter en tant que commande initiale échouera. La prochaine étape consiste donc à confier cette tâche à un shell.

docker exec [id] "bash -c 'cd /var/www/project && composer install'"

Et enfin, à ce stade, le && est entré dans un ensemble intérieur de guillemets, nous n’avons donc pas vraiment besoin des guillemets autour de la commande bash ... vous pouvez les supprimer si vous préférez.

docker exec [id] bash -c 'cd /var/www/project && composer install'
19
Dan Lowe

Tout ce qui suit le conteneur est la commande à exécuter. Ainsi, dans le premier exemple, -c n'est pas une option à exécuter, mais un docker de commandes tente de s'exécuter et échoue car cette commande n'existe pas.

Très probablement, vous avez trouvé cette syntaxe à partir d'une commande docker run 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 tel que bash ou, dans l'exemple ci-dessous, sh:

docker exec [id] /bin/sh -c 'cd /var/www/project && composer install'
2
BMitch

comme l'a dit Nehal J Wani dans son commentaire, la syntaxe correcte est la suivante:

docker exec [id] /bin/bash -c 'cd /var/www/project && composer install'

merci beaucoup!

1
BraveAdmin

Les autres réponses conviennent si vous voulez exécuter 2 commandes arbitraires. Mais si la première commande est simplement cd, utilisez plutôt l'option -w pour définir le répertoire de travail.

docker exec -w {dir} {container} {commands}

Donc dans votre exemple:

docker exec -w /var/www/project {container} composer install
0
wisbucky