Докері exec / запустити команду оболонки введення


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, але вони, ймовірно, використовують одне ядро).

Коли я впадаю в контейнер, використовуючи docker exec -it <container_id> /bin/shта запускаючи абсолютно ту саму команду, вона працює як шарм.

Здається, що виконання команд оболонки через docker 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

Можливо, ваша команда не працює, як ви очікували, завдяки загальній баш-хатчі:

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>")'

EDIT: Трохи демонстрації

[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")
Marcel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.