A short introduction to the use case:

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

  • What exactly command did you run? In $(go list ./... | grep -v '<excluded>', what's <excluded> is?
    – cuonglm
    Jun 13, 2016 at 7:49
  • It's a directory, vendor for example. Jun 13, 2016 at 8:48
  • 4
    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?
    – cuonglm
    Jun 13, 2016 at 8:59
  • Why not run the commands from a script?
    – 030
    Jun 14, 2016 at 17:15

2 Answers 2


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

From go test --help:

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

So I guess something like go test -run "(!vendor)" ./... would skip that particular folder.

  • Thanks Marcel, this works! Unfortunately it does list all directories in which it does not match any tests - listing the entire vendor directory with "no test files". Jun 15, 2016 at 11:23
  • Well, you can always filter those: $(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor")
    – Marcel
    Jun 15, 2016 at 16:21

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.