it-swarm.com.de

Verschachtelung des Shell-Befehls von Docker exec / run

Eine kurze Einführung in den Anwendungsfall:

Ich verwende einen docker Container, um meine go Tests mit go test ./... Auszuführen. Dies kann leicht mit docker exec <container> /bin/sh -c "go test ./..." Erreicht werden. Leider läuft go test ./... In allen Unterverzeichnissen und ich möchte eines (das Herstellerverzeichnis) ausschließen.

Die empfohlene Lösung hierfür ist die Verwendung des folgenden Befehls: go test $(go list ./... | grep -v '<excluded>'. Dies führt irgendwie zu folgendem Ergebnis:

docker run golang:1.6.2-Alpine /bin/sh -c "go test " (Ich habe dies sowohl auf run als auch auf exec getestet, aber sie verwenden wahrscheinlich denselben Kern).

Wenn ich mit docker exec -it <container_id> /bin/sh In den Container ssh und genau den gleichen Befehl ausführe, funktioniert das wie ein Zauber.

Es scheint, dass das Ausführen von Shell-Befehlen über das Docker exec/run keine Befehle unterstützt, die mit $() verschachtelt sind.

16

Ihr Befehl funktioniert möglicherweise nicht wie erwartet, dank eines allgemeinen Bash-Gotchas:

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

Der Befehl, den Sie ausführen möchten, führt die Erweiterung der Subshell $() auf Ihrem Host durch, da sie sich in doppelten Anführungszeichen befindet.

Dies kann gelöst werden, indem Sie Ihren Befehl einfach zitieren, wie von @cuonglm in den Fragenkommentaren vorgeschlagen.

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

EDIT: Eine kleine Demo

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

Von go test --help:

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

Ich denke also, so etwas wie go test -run "(!vendor)" ./... würde diesen bestimmten Ordner überspringen.

0
Marcel