Я использую 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
Итак, обратите внимание, что $ (...) был расширен вашей оболочкой в двойных кавычках до того, как он был запущен внутри контейнера docker. Таким образом, проблема может быть связана с вашим текущим содержимым каталога. Сделал ли `docker exec container /bin/sh -c 'go test $(go list ./… | grep -v “<исключено>”)" работает?