用例简介:
我正在使用docker容器来运行我的gotesting,使用go test ./... docker go test ./... 这可以使用docker exec <container> /bin/sh -c "go test ./..."轻松实现。 不幸的是go test ./...运行所有子目录,我想排除一个(供应商目录)。
build议的解决scheme是使用以下命令: go test $(go list ./... | grep -v '<excluded>' ,不知怎的,这给我留下如下结果:
docker run golang:1.6.2-alpine /bin/sh -c "go test " (我已经在run和exec中testing过了,但是它们可能使用相同的核心)。
当我使用docker exec -it <container_id> /bin/sh ssh进入容器并运行完全相同的命令时,它就像一个魅力。
看来执行shell命令通过docker exec / run不支持任何与$()嵌套的命令?
由于一个常见的bash陷阱,你的命令可能不像你预期的那样工作:
docker exec <container> /bin/sh -c "go test $(go list ./... | grep -v '<excluded>')"
您尝试运行的命令将在主机上执行子shell $()的扩展,因为它位于双引号内。
这可以通过@Conglm在问题注释中build议的单引号来解决。
docker exec <container> /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'
编辑:一个小演示
[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
从go test --help :
-run regexp Run only those tests and examples matching the regular expression.
所以我go test -run "(!vendor)" ./...将跳过该特定的文件夹。