Вложенность команд Docker exec/run shell

Краткое введение в пример использования:

Я использую 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)" ./... пропустил бы эту конкретную папку.

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

Почему бы не выполнить команды из скрипта?

What exactly command did you run? In $(go list ./... | grep -v '<excluded>", что такое

Это каталог, например, “поставщик”.