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 $()
?
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
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.