ডকার এক্সেক / রান শেল কমান্ড নেস্টিং চালাচ্ছে


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 " (আমি এটি রান এবং এক্সিকিউট উভয় ক্ষেত্রেই পরীক্ষা করেছি, তবে তারা সম্ভবত একই কোরটি ব্যবহার করে)।

যখন আমি docker exec -it <container_id> /bin/shঠিক একই কমান্ডটি ব্যবহার করে ধারকটিতে প্রবেশ করি এবং এটি চালকের মতো কাজ করে।

দেখে মনে হচ্ছে শেল কমান্ড কার্যকর করে ডকার এক্সিকিউট / রান চালিত কোনও কমান্ড সমর্থন করে না $()?


আপনি কি ঠিক কমান্ড চালানো হয়েছে? ইন $(go list ./... | grep -v '<excluded>', কি <excluded>?
cuonglm

vendorউদাহরণস্বরূপ এটি একটি ডিরেক্টরি ।
ওয়েসলি ভ্যান অপডর্প

4
ঠিক আছে, সুতরাং $(...)নোটার ধারকটির ভিতরে এটি চালানোর আগে ডাবল উদ্ধৃতিগুলির মধ্যে আপনার শেল দ্বারা প্রসারিত করা হয়েছে তা নোট করুন । সুতরাং, সমস্যাটি আপনার বর্তমান ডিরেক্টরি সামগ্রী থেকে আসতে পারে। কি docker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'কাজ করে?
cuonglm

স্ক্রিপ্ট থেকে আদেশগুলি চালাবেন না কেন ?
030

উত্তর:


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")
মার্সেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.