docker run <IMAGE> <MULTIPLE COMMANDS>


254

मैं इस तरह से MULTIPLE कमांड चलाने की कोशिश कर रहा हूं।

docker run image cd /path/to/somewhere && python a.py

लेकिन यह मुझे "ऐसी कोई फ़ाइल या निर्देशिका नहीं" त्रुटि देता है क्योंकि इसे इस रूप में व्याख्या किया गया है ...

"docker run image cd /path/to/somewhere" && "python a.py"

ऐसा लगता है कि कुछ ESCAPE वर्ण जैसे "" या () की आवश्यकता है।

इसलिए मैंने भी कोशिश की

docker run image "cd /path/to/somewhere && python a.py"
docker run image (cd /path/to/somewhere && python a.py)

लेकिन ये काम नहीं किया।

मैंने डॉकर रन संदर्भ के लिए खोज की है, लेकिन ESCAPE वर्णों के बारे में कोई संकेत नहीं पाया है।

जवाबों:


439

डॉकटर, उपयोग /bin/bash -cऔर अर्धविराम में कई कमांड चलाने के लिए;

docker run image_name /bin/bash -c "cd /path/to/somewhere; python a.py"

यदि हमें कमांड 2 (अजगर) की जरूरत है, तो निष्पादित किया जाएगा और केवल अगर कमांड 1 (सीडी) शून्य (कोई त्रुटि नहीं) निकास स्थिति लौटा दी जाती है, तो &&इसके बजाय उपयोग करें;

docker run image_name /bin/bash -c "cd /path/to/somewhere && python a.py"

आपके संकेत के लिए धन्यवाद! मैंने बस कोशिश की [docker run image "cd / bin; ls"] और त्रुटि संदेश मिला। [निष्पादन: "सीडी / बिन; एलएस": स्टेट सीडी / बिन; ls: ऐसी कोई फ़ाइल या निर्देशिका] [डेमन से त्रुटि प्रतिक्रिया: कंटेनर प्रारंभ नहीं कर सकता]
ai0307

1
किसी को भी यह उत्तर मिलता है कि कंटेनर में कमांड को खिलाने के लिए यहां दस्तावेजों का उपयोग करने में रुचि हो सकती है: यहां मेरा एक और सवाल इस तरह के दस्तावेजों के बारे में है, इसे जांचने के लिए स्वतंत्र महसूस करें
कोहनी रॉबर्ट

14
docker run alpine sh -c "ls | wc >> xxx"यह मुझे बहुत मदद करता है, जब बैश उपलब्ध नहीं होता है।
एड्डी हर्नांडेज़

1
यह cdउन चीजों के लिए काम करता है, जहां उन चीजों के लिए नहीं है जहां रिटर्न कोड मायने ;नहीं रखते &&हैं जैसे कि unix.stackexchange.com/questions/37069/…
Nick

1
धन्यवाद @NickZalutskiy, आपकी टिप्पणी के साथ अपडेट किया गया उत्तर
ahlc

31

आप इसे कुछ तरीके से कर सकते हैं:

  1. कार्य निर्देशिका को बदलने के लिए -w विकल्प का उपयोग करें:

    -w, --workdir = "" कंटेनर के अंदर कार्यशील निर्देशिका

    https://docs.docker.com/engine/reference/commandline/run/#set-working-directory--w

  2. पूरा तर्क / बिन / बैश पास करें:

    docker run image /bin/bash -c "cd /path/to/somewhere; python a.py"
    

--workdirदिए गए लिंक में कोई उल्लेख नहीं है । पृष्ठ संभवतः स्थानांतरित / बदल गया है। Docs.docker.com/engine/reference/run/#workdir या docs.docker.com/engine/reference/commandline/run पर
'16:

10

आप bash -c "<command1> | <command2>"उदाहरण के लिए , डॉकर कंटेनर के अंदर कमांड को पाइप कर सकते हैं :

docker run img /bin/bash -c "ls -1 | wc -l"

लेकिन, रिमोट में शेल को शामिल किए बिना आउटपुट को स्थानीय टर्मिनल पर पुनर्निर्देशित किया जाएगा।


3

यदि आप परिणाम को अपनी स्थानीय मशीन में कंटेनर के बाहर एक फ़ाइल में संग्रहीत करना चाहते हैं, तो आप ऐसा कुछ कर सकते हैं।

RES_FILE=$(readlink -f /tmp/result.txt)

docker run --rm -v ${RES_FILE}:/result.txt img bash -c "cat /etc/passwd | grep root > /result.txt"

आपके आदेशों का परिणाम /tmp/result.txtआपके स्थानीय मशीन में उपलब्ध होगा ।


2

किसी और के लिए जो docker-composeआपके साथ ऐसा करने के लिए यहां आए थे, बस आपको bash -cउद्धरणों में कई आदेशों को प्रस्तुत करने और संलग्न करने की आवश्यकता है , एक साथ शामिल हुए &&

तो ओपी उदाहरण में docker-compose run image bash -c "cd /path/to/somewhere && python a.py"


यह मेरे लिए काम करता है लेकिन कमांड निष्पादित होने के बाद
docker

और मैं ऐसी डॉकटर प्रक्रिया से कैसे बाहर निकलूं? Ctrl C या ctrl Z दबाने से या टाइपिंग एग्जिट काम नहीं कर रहा है या क्या मुझे डॉकटर स्टॉप कमांड द्वारा इसे मारना है?
नोड_मन

काम docker-compose down [service-name]नहीं करता है या? (और कोई चिंता नहीं, आपका स्वागत है, मदद करने के लिए खुश :))
एस ..

2

बस @Eddy हर्नांडेज़ की टिप्पणी से उचित उत्तर देने के लिए और जो बहुत सही है क्योंकि अल्पाइन राख के साथ नहीं आती है।

सवाल अब referes डोकर अल्पाइन कंटेनर में एक खोल शुरू जो का उपयोग कर निकलता है shया ashया /bin/shया /bin/ash/

ओपी के सवाल के आधार पर:

docker run image sh -c "cd /path/to/somewhere && python a.py"


1

bash -cअच्छी तरह से काम करता है अगर आप जो कमांड चला रहे हैं वह अपेक्षाकृत सरल है। हालाँकि, यदि आप नियंत्रण वर्णों से भरी कमांडों की एक लंबी श्रृंखला चलाने की कोशिश कर रहे हैं, तो यह जटिल हो सकती है।

मैंने अपने आदेशों को पाइपिंग से बाहर से, अर्थात, बाहर से सफलतापूर्वक प्राप्त किया

cat script.sh | docker run -i <image> /bin/bash

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.