Docker exec/execute o aninhamento do comando shell

Uma breve introdução ao caso de uso:

Estou usando um docker container para executar meu go testes usando go test ./.... Isso pode ser alcançado facilmente usando docker exec <container> /bin/sh -c "go test ./...". Infelizmente go test ./... é executado em todos os subdiretórios e gostaria de excluir um (o diretório do Fornecedor).

A Solução Recomendada para isso é usar o seguinte comando: go test $(go list ./... | grep -v '<excluded>', de alguma forma isso me deixa com o seguinte resultado:

docker run golang:1.6.2-alpine /bin/sh -c "go test " (Eu testei isso em run e exec, mas eles provavelmente usam o mesmo núcleo).

Quando eu ssh no contêiner usando docker exec -it <container_id> /bin/sh e execute exatamente o mesmo comando, funciona como um encanto.

Parece que a execução de comandos shell através do Docker exec / run não suporta nenhum comando aninhado com $()?

Seu comando pode não estar funcionando como você esperava graças a um bash gotcha comum:

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

O comando que você está tentando executar executará a expansão do subshell $() em seu host porque está dentro de aspas duplas.

Isso pode ser resolvido citando seu comando como sugerido por @ cuonglm nos comentários da pergunta.

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

Editar: um pouco de demonstração

[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

De go test --help:

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

Então eu acho que algo como go test -run "(!vendor)" ./... ignoraria essa pasta específica.

OK, então observe que’ $(…) 'foi expandido pelo seu shell dentro de aspas duplas antes de ser executado dentro do contêiner docker. Portanto, o problema pode vir do conteúdo do diretório atual. Did ‘Docker exec container / bin / sh-c’ go test $(lista go ./… / grep-v" < excluídos>") " trabalho?

Por que não executar os comandos de um script?

What exactly command did you run? In $(go list ./... | grep -v '<excluded>", o que é

É um diretório, ‘fornecedor’, por exemplo.