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

15

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

Я использую 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>это?
cuonglm
Это каталог, vendorнапример.
Уэсли ван Опдорп
4
Итак, обратите внимание, что $(...)ваша оболочка была развернута внутри двойных кавычек, прежде чем она была запущена внутри контейнера докера. Таким образом, проблема может исходить от вашего текущего содержимого каталога. Работал docker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'?
Cuonglm
Почему бы не запустить команды из скрипта ?
030

Ответы:

30

Ваша команда может работать не так, как вы ожидали, из-за общей ошибки 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
Уилл Барнвелл
источник
0

От go test --help:

-run regexp     Run only those tests and examples matching the regular
                expression.

Так что я думаю, что-то вроде go test -run "(!vendor)" ./...пропускает эту конкретную папку

завивать волосы щипцами
источник
Спасибо Марсель, это работает! К сожалению, в нем перечислены все каталоги, в которых он не соответствует ни одному из тестов - список всего каталога вендора «без тестовых файлов».
Уэсли ван Опдорп,
Ну, вы всегда можете отфильтровать те:$(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor")
Марсель