Docker exec / run shell 명령 중첩


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정확히 같은 명령을 사용하여 컨테이너에 ssh 하고 실행하면 매력처럼 작동합니다.

docker exec / run을 통해 쉘 명령을 실행하면 중첩 된 명령을 지원하지 않는 것 같습니다 $().


정확히 어떤 명령을 실행 했습니까? 에서 $(go list ./... | grep -v '<excluded>', 무엇 <excluded>입니까?
cuonglm 2016 년

vendor예를 들어 디렉토리 입니다.
웨슬리 반 옵 도프

4
OK, 참고 그래서 $(...)이 고정 표시기 컨테이너 내에서 실행되기 전에 큰 따옴표 안에 쉘에 의해 확장되었다. 따라서 현재 디렉토리 내용에서 문제가 발생할 수 있습니다. docker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'작동 했습니까 ?
cuonglm

스크립트 에서 명령 실행하지 않습니까?
030

답변:


30

일반적인 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

0

보낸 사람 go test --help:

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

따라서 go test -run "(!vendor)" ./...특정 폴더를 건너 뛰는 것 같습니다 .


고마워 마르셀,이 작동합니다! 불행히도 테스트와 일치하지 않는 모든 디렉토리를 나열합니다. "테스트 파일이없는"전체 벤더 디렉토리를 나열합니다.
Wesley van Opdorp 2016 년

글쎄, 당신은 항상 그것들을 필터링 할 수 있습니다 :$(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor")
Marcel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.