Anexar de execução do shell / exec do shell do Docker

12

Uma breve introdução ao caso de uso:

Estou usando um contêiner docker para executar meus go testes usando go test ./... . Isso pode ser obtido 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 de fornecedores).

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 " (testei isso em ambos, execute e exec, mas eles provavelmente usam o mesmo núcleo).

Quando eu ssh no container usando docker exec -it <container_id> /bin/sh e executo o mesmo comando, ele funciona como um charme.

Parece que executar comandos shell através do docker exec / run não suporta nenhum comando aninhado com $() ?

    
por Wesley van Opdorp 09.06.2016 / 15:33

2 respostas

21

Seu comando pode não estar funcionando como você esperava graças a uma pegadinha comum:

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

O comando que você está tentando executar realizará a expansão da subshell $() em seu host porque ele está entre aspas duplas.

Isso pode ser resolvido com uma única citação do seu comando, como sugerido por @cuonglm nos comentários da questão.

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

EDIT: 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
    
por 15.06.2016 / 22:30
0

De go test --help :

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

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

    
por 13.06.2016 / 15:17

Tags