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
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?