2015-09-22 8 views
7

में बैश समारोह को चलाने के लिए कैसे मैं एक पार्टी समारोह nvm/root/.profile में परिभाषित किया गया है। docker build कि समारोह को खोजने के लिए जब मैं RUN चरण में इसे कहते विफल रहा है।Dockerfile

RUN apt-get install -y curl build-essential libssl-dev && \ 
    curl https://raw.githubusercontent.com/creationix/nvm/v0.16.1/install.sh | sh 
RUN nvm install 0.12 && \ 
    nvm alias default 0.12 && \ 
    nvm use 0.12 

त्रुटि

Step 5 : RUN nvm install 0.12 
---> Running in b639c2bf60c0 
/bin/sh: nvm: command not found 

मैं bash -ic साथ यह लपेटकर द्वारा nvm कॉल करने के लिए है, जो /root/.profile लोड होगा कामयाब रहे है।

RUN bash -ic "nvm install 0.12" && \ 
    bash -ic "nvm alias default 0.12" && \ 
    bash -ic "nvm use 0.12" 

उपरोक्त विधि ठीक काम करता है, लेकिन यह एक चेतावनी

bash: cannot set terminal process group (1): Inappropriate ioctl for device 
bash: no job control in this shell 

है और मैं जानना चाहता हूँ वहाँ एक आसान और क्लीनर रास्ता बिना bash -ic बैश समारोह यह सामान्य द्विआधारी है सीधे रूप में कॉल करने के लिए है रैपिंग?

RUN load_functions && \ 
    nvm install 0.12 && \ 
    nvm alias default 0.12 && \ 
    nvm use 0.12 
+0

'भागो बैश -c 'nvm 0.12 && nvm उर्फ ​​डिफ़ॉल्ट स्थापित 0.12 && nvm उपयोग 0.12'' चाल करना चाहिए। क्या यह आपके लिए काम करता है? (मैं 100% यकीन है कि क्योंकि मैं नहीं जानता कि कैसे अपने कंटेनर में विस्तार से विचार कर रही है नहीं कर रहा हूँ) – hek2mgl

+0

यह ठीक काम करता है। लेकिन मैं एक बेहतर समाधान की तलाश में हूं। – Quanlong

+0

ठीक है, मेरा जवाब जांचें। एक खोल स्क्रिप्ट इसे करने का सबसे साफ तरीका है। – hek2mgl

उत्तर

4

डोकर के RUN की तरह हो सकता है कि कुछ एक खोल में आदेश शुरू नहीं करता है। यही कारण है कि खोल कार्य करता है और (cmd1 & & cmd2) की तरह खोल वाक्य रचना बॉक्स से बाहर नहीं किया जा रहा सकता है।

RUN bash -c 'nvm install 0.12 && nvm alias default 0.12 && nvm use 0.12' 

आपको लगता है कि लंबे समय से कमांड लाइन से डरते हैं, एक खोल स्क्रिप्ट में उन आदेशों रख दिया और RUN साथ स्क्रिप्ट फोन:

script.sh

आप स्पष्ट रूप से खोल कॉल करने की आवश्यकता
#!/bin/bash 

nvm install 0.12 && \ 
nvm alias default 0.12 && \ 
nvm use 0.12 

और यह निष्पादन योग्य बनाने:

chmod +x script.sh 

Dockerfile में डाल दिया:

RUN /path/to/script.sh 
+0

मुझे कुछ अलग चरणों में चलाने के लिए एनवीएम की आवश्यकता है। और मुझे लगता है कि कमांड को कई लाइनों के रूप में स्वरूपित करते समय 'bash -c' का सही उद्धरण नियंत्रित करना कठिन होता है। – Quanlong

+0

यही कारण है कि मैंने एक शैल स्क्रिप्ट का उपयोग करने का सुझाव दिया है। – hek2mgl

+0

मुझे नहीं लगता कि आपको एकाधिक स्क्रिप्ट क्यों चाहिए। क्या आप इसे विस्तार में बताने में सक्षम हैं? एक बार मुझे यह मिल गया तो मैं कुछ सुझाव दे सकता हूं। – hek2mgl

संबंधित मुद्दे