Docker exec / run shell 명령 중첩 docker exec

사용 사례에 대한 간단한 소개 :

를 사용하여 테스트 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)" ./...특정 폴더를 건너 뛰는 것 같습니다 .