web-dev-qa-db-fra.com

Docker exec / run Imbrication de commandes Shell

Une brève introduction au cas d'utilisation:

J'utilise un conteneur docker pour exécuter mes tests go en utilisant go test ./.... Ceci peut être réalisé facilement en utilisant docker exec <container> /bin/sh -c "go test ./...". Malheureusement, go test ./... S'exécute dans tous les sous-répertoires et j'aimerais en exclure un (le répertoire des fournisseurs).

La solution conseillée est d'utiliser la commande suivante: go test $(go list ./... | grep -v '<excluded>', Cela me laisse en quelque sorte le résultat suivant:

docker run golang:1.6.2-Alpine /bin/sh -c "go test " (J'ai testé cela sur run et exec, mais ils utilisent probablement le même noyau).

Quand je ssh dans le conteneur en utilisant docker exec -it <container_id> /bin/sh Et que j'exécute exactement la même commande, cela fonctionne comme un charme.

Il semble que l'exécution de commandes Shell via le docker exec/run ne prend en charge aucune commande imbriquée avec $()?

16

Votre commande peut ne pas fonctionner comme prévu grâce à un gotcha bash commun:

docker exec <container> /bin/sh -c "go test $(go list ./... | grep -v '<excluded>')"

La commande que vous essayez d'exécuter effectuera l'expansion de la sous-coquille $() sur votre hôte car elle se trouve entre guillemets.

Cela peut être résolu en citant simplement votre commande comme suggéré par @cuonglm dans les commentaires de la question.

docker exec <container> /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'

EDIT: Une petite démo

[wbarnwell@Host ~]$ docker run -it --rm busybox /bin/sh -c '$(whoami)'
/bin/sh: root: not found
[wbarnwell@Host ~]$ docker run -it --rm busybox /bin/sh -c "$(whoami)"
/bin/sh: wbarnwell: not found
31
Will Barnwell

De go test --help:

-run regexp     Run only those tests and examples matching the regular
                expression.

Donc je suppose que quelque chose comme go test -run "(!vendor)" ./... sauterait ce dossier particulier.

0
Marcel