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