Краткое введение в вариант использования:
Я использую 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
и запускаю ту же команду, это работает как шарм.
Кажется, что выполнение команд оболочки через докер exec / run не поддерживает команды, вложенные в $()
?
$(go list ./... | grep -v '<excluded>'
что<excluded>
это?vendor
например.$(...)
ваша оболочка была развернута внутри двойных кавычек, прежде чем она была запущена внутри контейнера докера. Таким образом, проблема может исходить от вашего текущего содержимого каталога. Работалdocker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'
?Ответы:
Ваша команда может работать не так, как вы ожидали, из-за общей ошибки bash:
Команда, которую вы пытаетесь выполнить, выполнит развертывание подоболочки
$()
на вашем хосте, поскольку она находится в двойных кавычках.Это можно решить, заключив в кавычки вашу команду, как предложено @cuonglm в комментариях к вопросу.
РЕДАКТИРОВАТЬ: немного демо
источник
От
go test --help
:Так что я думаю, что-то вроде
go test -run "(!vendor)" ./...
пропускает эту конкретную папкуисточник
$(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor")