Une brève introduction au cas d'utilisation:
J'utilise un docker
conteneur pour exécuter mes go
tests 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 recommandée pour cela utilise 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).
Lorsque je ssh dans le conteneur en utilisant docker exec -it <container_id> /bin/sh
et en exécutant 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 $()
?
$(go list ./... | grep -v '<excluded>'
, qu'est-ce que<excluded>
c'est?vendor
par exemple.$(...)
votre shell a été développé par des guillemets doubles avant d'être exécuté à l'intérieur du conteneur Docker. Le problème peut donc provenir du contenu de votre répertoire actuel. Adocker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'
fonctionné?Réponses:
Votre commande peut ne pas fonctionner comme prévu grâce à un gotcha bash commun:
La commande que vous essayez d'exécuter effectuera l'expansion du sous-shell
$()
sur votre hôte car il est entre guillemets doubles.Cela peut être résolu en citant simplement votre commande comme suggéré par @cuonglm dans les commentaires de la question.
EDIT: Une petite démo
la source
De
go test --help
:Donc, je suppose que quelque chose comme
go test -run "(!vendor)" ./...
sauter ce dossier particulier.la source
$(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor")