사용 사례에 대한 간단한 소개 :
를 사용하여 테스트 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
정확히 같은 명령을 사용하여 컨테이너에 ssh 하고 실행하면 매력처럼 작동합니다.
docker exec / run을 통해 쉘 명령을 실행하면 중첩 된 명령을 지원하지 않는 것 같습니다 $()
.
답변
일반적인 bash gotcha 덕분에 명령이 예상대로 작동하지 않을 수 있습니다.
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)" ./...
특정 폴더를 건너 뛰는 것 같습니다 .