डॉकर निष्पादन / रन शेल कमांड नेस्टिंग

उपयोग के मामले का संक्षिप्त परिचय:

मैं एक का उपयोग कर रहा हूँ 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 " (मैंने इसे रन और निष्पादन दोनों पर परीक्षण किया है, लेकिन वे शायद एक ही कोर का उपयोग करते हैं) ।

जब मैं कंटेनर में एसएसएच का उपयोग कर docker exec -it <container_id> /bin/sh और ठीक उसी कमांड को चलाएं, यह एक आकर्षण की तरह काम करता है ।

ऐसा लगता है कि शेल कमांड निष्पादित करने से डॉकर निष्पादन/रन गर्त में निहित किसी भी कमांड का समर्थन नहीं करता है $()?

हो सकता है कि आपका आदेश काम नहीं कर रहा हो जैसा कि आपने उम्मीद की थी कि एक सामान्य बैश गोचा के लिए धन्यवाद:

docker exec <container> /bin/sh -c "go test $(go list ./... | grep -v '<excluded>')"

आप जिस कमांड को चलाने की कोशिश कर रहे हैं, वह सबशेल का विस्तार करेगा $() अपने मेजबान पर क्योंकि यह दोहरे उद्धरण चिह्नों के अंदर है ।

प्रश्न टिप्पणियों में @क्यूंगएलएम द्वारा सुझाए गए अनुसार आपके आदेश को उद्धृत करके इसे हल किया जा सकता है ।

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)" ./... उस विशेष फ़ोल्डर को छोड़ देगा।

ठीक है, तो ध्यान दें कि’ $( । …) 'डॉकर कंटेनर के अंदर चलाने से पहले डबल कोट्स के अंदर आपके शेल द्वारा विस्तारित किया गया था । तो, समस्या आपकी वर्तमान निर्देशिका सामग्री से आ सकती है । क्या ‘डॉकर निष्पादन कंटेनर /बिन/एसएच-सी’ गो टेस्ट $(गो सूची ।/… / ग्रेप-वी " <बहिष्कृत>") " काम?

आदेश क्यों न चलाएं एक स्क्रिप्ट से?

What exactly command did you run? In $(go list ./... | grep -v '<excluded>", क्या है

यह एक निर्देशिका है, उदाहरण के लिए` विक्रेता’ ।