I am using a docker container to run my go tests using go test ./.... This can be achieved easily using docker exec <container> /bin/sh -c "go test ./...". Unfortunately go test ./... runs across all subdirectories and I'd like to exclude one (the vendor directory).
The advised solution for this is using the following command: go test $(go list ./... | grep -v '<excluded>', somehow this leaves me with the following result:
docker run golang:1.6.2-alpine /bin/sh -c "go test " (I have tested this on both run and exec, but they probably use the same core).
When I ssh into the container using docker exec -it <container_id> /bin/sh and run the exact same command, it works like a charm.
It seems that executing shell commands trough the docker exec/run does not support any commands nested with $()?
Your command may not be working as you expected thanks to a common bash gotcha:
docker exec <container> /bin/sh -c "go test $(go list ./... | grep -v '<excluded>')"
The command you are trying to run will perform the expansion of the subshell $() on your host because it is inside double quotes.
This can be solved by single quoting your command as suggested by @cuonglm in the question comments.
docker exec <container> /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'
EDIT: A little demo
[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
OK, so note that $(...) was expanded by your shell inside double quotes before it was run inside docker container. So, the issue may come from your current directory content. Did docker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")' work?