Назад | Перейти на главную страницу

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

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

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