用例的简短介绍:
我正在使用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 命令不支持任何嵌套的命令$()
?
Wil*_*ell 36
由于常见的 bash 问题,您的命令可能无法按预期工作:
docker exec <container> /bin/sh -c "go test $(go list ./... | grep -v '<excluded>')"
Run Code Online (Sandbox Code Playgroud)
您尝试运行的命令将$()
在您的主机上执行子 shell 的扩展,因为它位于双引号内。
这可以通过在问题注释中按照@cuonglm 的建议单引号引用您的命令来解决。
docker exec <container> /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'
Run Code Online (Sandbox Code Playgroud)
编辑:一个小演示
[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
Run Code Online (Sandbox Code Playgroud)