docker: निष्पादन योग्य फ़ाइल $ PATH में नहीं मिली


216

मेरे पास एक डॉकटर छवि है जो इंस्टॉल करता है grunt, लेकिन जब मैं इसे चलाने की कोशिश करता हूं, तो मुझे एक त्रुटि मिलती है:

Error response from daemon: Cannot start container foo_1: \
    exec: "grunt serve": executable file not found in $PATH

अगर मैं इंटरैक्टिव मोड में बैश चलाता हूं, gruntतो उपलब्ध है।

मैं क्या गलत कर रहा हूं?

यहाँ मेरा डॉकफ़ाइल है:

# https://registry.hub.docker.com/u/dockerfile/nodejs/ (builds on ubuntu:14.04)
FROM dockerfile/nodejs

MAINTAINER My Name, me@email.com

ENV HOME /home/web
WORKDIR /home/web/site

RUN useradd web -d /home/web -s /bin/bash -m

RUN npm install -g grunt-cli
RUN npm install -g bower

RUN chown -R web:web /home/web
USER web

RUN git clone https://github.com/repo/site /home/web/site

RUN npm install
RUN bower install --config.interactive=false --allow-root

ENV NODE_ENV development

# Port 9000 for server
# Port 35729 for livereload
EXPOSE 9000 35729
CMD ["grunt"]

आप का उपयोग कर docker बनाने की कोशिश कर सकते हैं CMD grunt? या क्या आप पूरा रास्ता पास करके ग्रंट कमांड को निष्पादित करने का प्रयास कर सकते हैं?
एमजीएडो

@ mark91 कृपया आप पर विस्तृत सकता है क्या आप उपयोग कर रहे हैं का निर्माण पूछ रहे हैं CMD grunt?क्या आपका मतलब है ड्रॉप ["और "]?
स्टीव लॉरिमर

बस यह कोशिश की - और यह काम किया - धन्यवाद! तो किसी और में आने के लिए, परिवर्तन CMD ["grunt"]करने के लिएCMD grunt
स्टीव Lorimer

10
ऐसा इसलिए है क्योंकि यदि आप CMD ["grunt"]कमांड को निष्पादित करने के लिए किसी अन्य शेल का उपयोग करते हैं, तो उस शेल में $ PATH के सेट होने की संभावना नहीं है।
एमजीएडो

जवाबों:


198

जब आप कमांड के लिए निष्पादन प्रारूप का उपयोग करते हैं (जैसे CMD ["grunt"], दोहरे उद्धरण चिह्नों के साथ JSON सरणी) तो इसे बिना शेल के निष्पादित किया जाएगा । इसका मतलब है कि अधिकांश पर्यावरण चर मौजूद नहीं होंगे।

यदि आप अपने कमांड को एक नियमित स्ट्रिंग (जैसे CMD grunt) के रूप में निर्दिष्ट करते हैं, तो उसके बाद स्ट्रिंग को CMDनिष्पादित किया जाएगा /bin/sh -c

इस बारे में अधिक जानकारी डॉकरफाइल संदर्भ के सीएमडी अनुभाग में उपलब्ध है ।


2
यह संदर्भ के सीएमडी हिस्से के लिए एक लिंक है docs.docker.com/engine/reference/builder/#cmd
केल्विन

इस गूंगे प्रश्न को माफ करें, लेकिन आप शेल के बिना एक लिनक्स कमांड कैसे निष्पादित कर सकते हैं? यह एक linux मशीन पर ऐसा करने के लिए क्या बराबर होगा (docker का उपयोग नहीं)?
बुद्धिमानबाग

1
मेरे अपने प्रश्न का उत्तर देने के लिए, यह करने के समान है sudo setया (exec set)। वे विफल हो जाएंगे क्योंकि वे बिना शेल के कमांड को निष्पादित करते हैं (और setशेल बिलिन है)। हालाँकि, sudo lsऔर (exec ls)काम करेगा क्योंकि lsएक वास्तविक बाइनरी फ़ाइल है /bin/ls
वारबकी

315

यह Google पर पहला परिणाम था जब मैंने अपना त्रुटि संदेश चिपकाया था, और यह इसलिए है क्योंकि मेरे तर्क क्रम से बाहर थे।

कंटेनर नाम सभी तर्कों के बाद होना चाहिए ।

खराब:

docker run <container_name> -v $(pwd):/src -it

अच्छा:

docker run -v $(pwd):/src -it <container_name>

132
यदि आपने कोडिंग शुरू करने से पहले हमेशा प्रलेखन को अच्छी तरह से पढ़ा है, तो आपको कभी भी कुछ नहीं मिलेगा। जब आपने अपनी नई कार खरीदी, तो क्या आपने घर छोड़ने से पहले 200 पेज की पुस्तिका पढ़ी थी? नहीं, और जब आपकी कार में कोई समस्या थी, तो क्या आपने इसे पहले गूगल किया था, या क्या आप मैनुअल प्राप्त करते थे? यह पूरी तरह से उचित है, मैं केवल उन सभी लोगों की कल्पना कर सकता हूं जिन्होंने इसे उपयोगी पाया लेकिन अपवोट बटन पर क्लिक नहीं किया! यह किस तरह का अनुचित है, यह पूरी तरह से असंबंधित उत्तर इस त्रुटि संदेश के लिए पहला Google परिणाम है, या यह कि डॉकटर क्लिंट अचिंत्य और अक्षम है। चीयर्स।
सरिंक

8
कई लिपियों में झंडे का क्रम महत्वपूर्ण नहीं है, इसलिए मैं देख सकता हूं कि किसी के साथ भी ऐसा क्यों हो सकता है। उत्तर काफी मददगार है। यह कहने की आवश्यकता नहीं है कि डॉक से त्रुटि संदेश उपयोगी नहीं है।
माविस

9
वाह, मैं इस जवाब के लिए नहीं तो थोड़ी देर के लिए संघर्ष किया होगा। UNIX में एक मानक, लचीला और शक्तिशाली CLI तर्क पार्सर क्यों नहीं है? ...
13

1
यह मेरे लिए मुद्दा था। अंत में कंटेनर का नाम काम लग रहा था
रोब सेगल

3
मुझे स्वीकार किए गए जवाब से गुमराह किया गया था, मैं खुद लिखना चाहता था, लेकिन लगता है कि यह पहले से ही यहां है। इसलिए मैं पुष्टि कर सकता हूं कि यह समस्या को हल करता है ...
आर्टुरस एम।

24

मुझे वही समस्या मिली। मैंने निम्नलिखित कार्य किया:

docker run -ti devops -v /tmp:/tmp /bin/bash

जब मैं इसे बदलता हूं

docker run -ti -v /tmp:/tmp devops /bin/bash

यह बढ़िया काम करता है।


1
इसने मेरे लिए काम किया, लेकिन मैं -vयहाँ के उपयोग को नहीं समझता । -vएक खंड को माउंट करने के लिए (जैसा कि में वर्णित है docker run --help | grep "\-v"), मेरे लिए, मैं पहले से ही (डॉकटर सेटिंग्स) /tmpमें चढ़ चुका हूं File Sharing, इसलिए मुझे इसे फिर से क्यों उपयोग करना चाहिए?
अहमद

12

इस तरह की त्रुटि के कई संभावित कारण हैं।

मेरे मामले में, यह निष्पादन योग्य फ़ाइल की वजह से (था docker-entrypoint.shसे भूत Dockerfile ब्लॉग ) निष्पादन योग्य फ़ाइल मोड की कमी के बाद मैं इसे डाउनलोड किया था।

उपाय: chmod +x docker-entrypoint.sh


यह वह टिप्पणी है जिसने मुझे सही उत्तर की ओर इशारा किया है। मुझे फाइल कॉपी करनी थी और फिर उसे चोदना था।
परेवितल

7

डॉकर कंटेनर बिना शेल के बनाया जा सकता है (जैसे https://github.com/fluent/fluent-bit-docker-image/issues/19 )।

इस मामले में, आप एक संकलित शेल में कॉपी-इन कर सकते हैं और इसे निष्पादित कर सकते हैं, जैसे

docker create --name temp-busybox busybox:1.31.0
docker cp temp-busybox:/bin/busybox busybox
docker cp busybox mycontainerid:/busybox
docker exec -it mycontainerid /bin/busybox sh

4

किसी कारण के लिए, मुझे वह त्रुटि मिलती है जब तक कि मैं "बाश" स्पष्टीकरण नहीं जोड़ता। यहां तक ​​कि मेरी प्रविष्टि फ़ाइल के शीर्ष पर "#! / Bin / bash" जोड़ने से भी मदद नहीं मिली।

ENTRYPOINT [ "bash", "entrypoint.sh" ]

@SteveLorimer, हाँ। मैंने एंट्रीपॉइंट कॉल से पहले एक COPYऔर फिर किया RUN chmod +x /compile_nibbler.sh
परे

1

मेरे पास एक ही समस्या थी, बहुत सारे गुग्लिंग के बाद, मुझे यह पता नहीं चला कि इसे कैसे ठीक किया जाए।

अचानक मैंने अपनी बेवकूफी भरी गलती पर ध्यान दिया :)

डॉक्स में उल्लेख किया गया है , अंतिम भाग docker runवह कमांड है जिसे आप चलाना चाहते हैं और कंटेनर को लोड करने के बाद उसके तर्क।

कंटेनर का नाम नहीं !!!

यह मेरी शर्मनाक गलती थी।

नीचे मैंने आपको मेरी कमांड लाइन की तस्वीर प्रदान की है यह देखने के लिए कि मैंने क्या गलत किया है।

और यह डॉक्स में बताए अनुसार फिक्स है ।

यहां छवि विवरण दर्ज करें


-7

यह काम करने के लिए / usr / बिन में नरम संदर्भ जोड़ें:

ln -s $ (जो नोड) / usr / बिन / नोड

ln -s $ (जो npm) / usr / bin / npm


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