Krótkie wprowadzenie do przypadku użycia:
Używam docker
kontenera do uruchamiania go
testów przy użyciu go test ./...
. Można to łatwo osiągnąć za pomocą docker exec <container> /bin/sh -c "go test ./..."
. Niestety go test ./...
działa we wszystkich podkatalogach i chciałbym wykluczyć jeden (katalog dostawcy).
Zalecanym rozwiązaniem jest użycie następującego polecenia: go test $(go list ./... | grep -v '<excluded>'
w jakiś sposób pozostawia mi to następujący wynik:
docker run golang:1.6.2-alpine /bin/sh -c "go test "
(Testowałem to zarówno w trybie run, jak i exec, ale prawdopodobnie używają tego samego rdzenia).
Kiedy ssh do kontenera używam docker exec -it <container_id> /bin/sh
i uruchamiam dokładnie to samo polecenie, działa to jak urok.
Wydaje się, że wykonywanie poleceń powłoki przez exec / run dokera nie obsługuje żadnych zagnieżdżonych poleceń $()
?
$(go list ./... | grep -v '<excluded>'
czym<excluded>
jest?vendor
.$(...)
został rozszerzony przez twoją powłokę wewnątrz podwójnych cudzysłowów, zanim została uruchomiona w kontenerze dokera. Problem może pochodzić z bieżącej zawartości katalogu. Czydocker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'
działa?Odpowiedzi:
Twoje polecenie może nie działać zgodnie z oczekiwaniami, dzięki wspólnej gotcha bash:
Polecenie, które próbujesz uruchomić, spowoduje rozwinięcie podpowłoki
$()
na hoście, ponieważ znajduje się ona w podwójnych cudzysłowach.Można to rozwiązać poprzez pojedyncze zacytowanie polecenia zgodnie z sugestią @cuonglm w komentarzach do pytania.
EDYCJA: Mała wersja demonstracyjna
źródło
Od
go test --help
:Sądzę więc, że coś takiego
go test -run "(!vendor)" ./...
pomija ten konkretny folder.źródło
$(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor")