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


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

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

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


वास्तव में आपने क्या आदेश दिया? में $(go list ./... | grep -v '<excluded>', क्या <excluded>है?
congonglm

यह एक निर्देशिका है, vendorउदाहरण के लिए।
वेस्ले वैन ओपडॉर्प

4
ठीक है, इसलिए ध्यान दें कि $(...)डॉक कंटेनर के अंदर चलने से पहले डबल कोट्स के अंदर आपके शेल द्वारा विस्तारित किया गया था। तो, समस्या आपकी वर्तमान निर्देशिका सामग्री से आ सकती है। क्या docker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'काम करता है?
congonglm

स्क्रिप्ट से कमांड क्यों नहीं चलाते ?
0:30

जवाबों:


30

हो सकता है कि आपका आदेश काम न कर रहा हो, जैसा कि आपने एक सामान्य बैश गेटा को धन्यवाद दिया था:

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


धन्यवाद मार्सेल, यह काम करता है! दुर्भाग्य से यह सभी निर्देशिकाओं को सूचीबद्ध करता है जिसमें यह किसी भी परीक्षण से मेल नहीं खाता है - पूरे विक्रेता निर्देशिका को "बिना परीक्षण फ़ाइलों" के साथ सूचीबद्ध करना।
वेस्ले वैन ओपडॉर्प

खैर, आप हमेशा उन फ़िल्टर कर सकते हैं:$(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor")
मार्सेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.