Docker exec / run shell命令嵌套


15

用例的简短介绍:

我正在使用一个docker容器使用来运行我的go测试go test ./...。使用可以轻松实现docker exec <container> /bin/sh -c "go test ./..."。不幸的是,go test ./...它遍历所有子目录,因此我想排除一个(供应商目录)。

建议的解决方案是使用以下命令:go test $(go list ./... | grep -v '<excluded>',不知何故,我得到以下结果:

docker run golang:1.6.2-alpine /bin/sh -c "go test " (我已经在run和exec上进行了测试,但是它们可能使用相同的内核)。

当我使用ssh进入容器docker exec -it <container_id> /bin/sh并运行完全相同的命令时,它就像一个超级按钮。

似乎通过docker exec / run执行shell命令不支持嵌套在$()


您到底运行了什么命令?在中$(go list ./... | grep -v '<excluded>',什么<excluded>是?
cuonglm

vendor例如,这是一个目录。
韦斯利·范·奥普多普

4
好的,因此请注意,$(...)在外壳程序在docker容器中运行之前,外壳程序已将其用双引号引起来。因此,问题可能出在您当前的目录内容上。做了docker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'工作?
cuonglm

为什么不从脚本运行命令?
030

Answers:


30

由于常见的bash陷阱,您的命令可能无法按预期工作:

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

您尝试运行的命令将$()在主机上执行子Shell的扩展,因为它在双引号内。

这可以通过在问题注释中单引@cuonglm所建议的命令来解决。

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

0

来自go test --help

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

所以我想类似的东西go test -run "(!vendor)" ./...会跳过那个特定的文件夹。


谢谢马塞尔,这可行!不幸的是,它确实列出了与任何测试都不匹配的所有目录-列出了带有“没有测试文件”的整个供应商目录。
韦斯利·范·奥普多普

好吧,您始终可以过滤以下内容:$(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor")
Marcel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.