Question Docker exec / run shell imbrication de commandes


Une brève introduction au cas d'utilisation:

J'utilise un docker conteneur pour exécuter mon go tests utilisant go test ./.... Ceci peut être réalisé facilement en utilisant docker exec <container> /bin/sh -c "go test ./...". Malheureusement go test ./... fonctionne dans tous les sous-répertoires et je voudrais en exclure un (le répertoire du fournisseur).

La solution conseillée consiste à utiliser la commande suivante: go test $(go list ./... | grep -v '<excluded>'En quelque sorte, cela me laisse avec le résultat suivant:

docker run golang:1.6.2-alpine /bin/sh -c "go test " (J'ai testé cela à la fois sur run et sur 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 exécutez exactement la même commande, cela fonctionne comme un charme.

Il semble que l’exécution de commandes de shell par le docker exec / run ne supporte aucune commande imbriquée avec $()?


12
2018-06-09 13:33


origine


Quelle commande avez-vous exécutée exactement? Dans $(go list ./... | grep -v '<excluded>', c'est quoi <excluded> est? - cuonglm
C'est un répertoire, vendor par exemple. - Wesley van Opdorp
OK, alors notez que $(...) a été développé par votre shell entre guillemets doubles avant d’être exécuté dans le conteneur Docker. Le problème peut donc provenir du contenu de votre répertoire actuel. Fait docker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")' travail? - cuonglm
Pourquoi ne pas exécuter les commandes à partir d'un script? - 030


Réponses:


Votre commande ne fonctionne peut-être pas comme prévu grâce à un bascha gotcha:

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

La commande que vous essayez d'exécuter va développer le sous-shell $() sur votre hôte car il est entre guillemets doubles.

Cela peut être résolu en citant une seule fois 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

21
2018-06-15 20:30





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
2018-06-13 13:17



Merci Marcel, ça marche! Malheureusement, il ne répertorie pas tous les répertoires dans lesquels il ne correspond à aucun test - listant tout le répertoire du fournisseur avec "aucun fichier de test". - Wesley van Opdorp
Eh bien, vous pouvez toujours filtrer ceux-ci: $(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor") - Marcel