Docker exec / run shell命令嵌套

用例简介:

我正在使用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)" ./...将跳过该特定的文件夹。