डॉकर कॉपी मुद्दा - "ऐसी कोई फ़ाइल या निर्देशिका नहीं"


36

मेरे डॉकरफ़ाइल में मेरे पास 'COPY' कथन है:

# Copy app code
COPY /srv/visitor /srv/visitor

यह कहे बिना जाना चाहिए कि मेरे मेजबान सिस्टम में, "/ srv / विजिटर" निर्देशिका के तहत, वास्तव में मेरा स्रोत कोड है:

[root@V12 visitor]# ls /srv/visitor/
Dockerfile  package.json  visitor.js

अब, जब मैं इस डॉकरीफाइल का उपयोग करके एक छवि बनाने की कोशिश करता हूं तो यह उस कदम पर लटक जाता है जब "COPY" माना जाता है:

Step 10 : COPY /srv/visitor /srv/visitor
INFO[0155] srv/visitor: no such file or directory

यह कहता है कि ऐसी कोई निर्देशिका नहीं है, लेकिन स्पष्ट रूप से है।

कोई विचार?

अद्यतन 1:

यह मेरे लिए इंगित किया गया है कि मुझसे गलती हुई थी, जिस तरह से मैंने निर्माण संदर्भ को समझा था। इस सुझाव ने "COPY" कथन को बदलने की कोशिश की:

COPY . /srv/visitor

समस्या यह है कि मैं इसे इस तरह से था, और निर्माण की प्रक्रिया बहुत अगले कदम पर रुकी:

RUN npm install

जब "स्पष्ट रूप से एक है, तो" नो पैकेज.जॉन फ़ाइल मिली "की तर्ज पर कुछ कहा गया।

अद्यतन 2:

मैंने इसे डॉकरफाइल में इस बदलाव के साथ चलाने की कोशिश की:

COPY source /srv/visitor/

यह npm चलाने की कोशिश करते समय रुका हुआ था:

Step 12 : RUN npm install
 ---> Running in ae5e2a993e11
npm ERR! install Couldn't read dependencies
npm ERR! Linux 3.18.5-1-ARCH
npm ERR! argv "/usr/bin/node" "/usr/sbin/npm" "install"
npm ERR! node v0.10.36
npm ERR! npm  v2.5.0
npm ERR! path /package.json
npm ERR! code ENOPACKAGEJSON
npm ERR! errno 34

npm ERR! package.json ENOENT, open '/package.json'
npm ERR! package.json This is most likely not a problem with npm itself.
npm ERR! package.json npm can't find a package.json file in your current directory.

npm ERR! Please include the following file with any support request:
npm ERR!     /npm-debug.log
INFO[0171] The command [/bin/sh -c npm install] returned a non-zero code: 34

तो, क्या प्रति प्रदर्शन किया गया है? यदि हाँ, तो npm संकुल.json को खोजने में असमर्थ क्यों है?


2017 में किसी मुद्दे की तलाश करने वालों के लिए - यह आपका मुद्दा github.com/docker/for-mac/issues/1922 हो सकता है । यह आपको .dockerignore फ़ाइल को हटाने और रिटायर करने की अनुशंसा करता है। अगर वह काम करता है तो आप इस मुद्दे को हल करने के लिए अपनी सेटिंग्स में .dockerignore के साथ फील कर सकते हैं।
अनिर्धारित

जवाबों:


35

प्रलेखन से:

<src>पथ निर्माण के संदर्भ के अंदर होना चाहिए ; आप COPY ../something / something नहीं कर सकते, क्योंकि docker build का पहला चरण do निर्देशिका डेमन को संदर्भ निर्देशिका (और उपनिर्देशिका) भेजना है।

जब आप उपयोग /srv/visitorकरते हैं तो आप बिल्ड संदर्भ के बाहर एक निरपेक्ष पथ का उपयोग कर रहे हैं, भले ही यह वास्तव में वर्तमान निर्देशिका हो।

आप बेहतर तरीके से अपने बिल्ड संदर्भ को व्यवस्थित करते हैं:

├── /srv/visitor
│   ├── Dockerfile
│   └── resources
│       ├── visitor.json
│       ├── visitor.js

और उपयोग करें :

COPY resources /srv/visitor/

ध्यान दें:

docker build - < Dockerfile कोई संदर्भ नहीं है।

इसलिए उपयोग करें,

docker build .


मैं पहले से ही अपने मेजबान सिस्टम के "/ srv / विजिटर" निर्देशिका के अंदर हूं, और मेरे सभी स्रोत कोड, प्लस डॉकरीफाइल, यहां है। मुझे अपना "COPY" कथन कैसे लिखना चाहिए ताकि यह सब स्रोत कंटेनर के "/ srv / विज़िटर" निर्देशिका के अंदर कॉपी हो जाए?
dsljanus

1
@dsljanus स्रोत निर्देशिका या फ़ाइल का निर्माण संदर्भ यानी निर्देशिका के सापेक्ष होना चाहिए /srv/visitor
ज़ेवियर लुकास

तो, यह होना चाहिए "?" क्योंकि मेरे पास यह तरीका था, और अगले चरण में बिल्ड प्रक्रिया रुकी, "RUN npm इंस्टॉल"। यह "नहीं package.json फ़ाइल पाया" की तर्ज पर कुछ कहा। कृपया मेरा अपडेट भी देखें।
dsljanus

2
@dsljanus और इसलिए आप कहां से npm चला रहे हैं? अपने पूरे डॉकटराइल को पोस्ट करें ... Btw प्रश्नों में इस तरह के कई अपडेट को संशोधित नहीं करते हैं, जो वास्तव में एक समस्या से पूरी तरह से एक ही पर कूदने के लिए परेशान है। एसएफ का उद्देश्य स्पष्ट उत्तर प्राप्त करने के लिए स्पष्ट प्रश्न पोस्ट करना है।
जेवियर लुकास

1
@dsljanus ठीक है इसलिए यह मुद्दा है, का उपयोग न करें, RUN cdलेकिन उपयोग करें WORKDIRताकि वर्तमान निर्देशिका को प्रत्येक चरण के बीच याद किया जाए। एक dockerfile docker run + docker प्रतिबद्ध के लिए एक आवरण से अधिक नहीं है इसलिए प्रत्येक चरण पिछली परत पर स्वतंत्र रूप से चलाया जाता है। /यदि आप इस निर्देश का उपयोग नहीं करते हैं तो इसका मतलब है कि प्रत्येक चरण में pwd बराबर है।
जेवियर लुकास

39

मेरे लिए निर्देशिका सही संदर्भ में थी, केवल इसे .dockerignoreपरियोजना की जड़ में (छिपी) फ़ाइल में शामिल किया गया था । यह त्रुटि संदेश की ओर जाता है:

lstat mydir/myfile.ext: no such file or directory

3
तुम्हारा मतलब था .dockerignore? यह मेरे साथ हुआ
मार्टीन कोल

5
तुम्हें आशीर्वाद देते हैं! एक पूरी निर्देशिका थी जिसकी मैं अनदेखी कर रहा था कि मैं इसके बारे में भूल गया और इसने मेरा निर्माण तोड़ दिया। एक छोटे नोट के रूप में, आप किसी एकल फ़ाइल को उस निर्देशिका में अनदेखा कर सकते हैं: !path/to/my/fileभले ही pathवह अंदर हो .dockerignore
hjc1710

यह अच्छा है।
गुडलुगुर एगिल्सन

यह व्यक्त नहीं कर सकता कि इसके लिए मैं आपका कितना आभारी हूं, पिछले पूरे दिन खुद पर अत्याचार कर रहा था। अभी भी इसे प्राप्त नहीं किया जा सकता है कि डॉक के लिए वी.एस. टूल्स में * के साथ एक डॉकेरिग्नोर भी शामिल है
bilal.haider

7

मेरे लिए मुद्दा यह था कि मैं उपयोग कर रहा था docker build - < Dockerfile

से प्रलेखन नोट: यदि आप STDIN (का उपयोग कर बनाते हैं docker build - < somefile), वहाँ कोई निर्माण संदर्भ है, इसलिए कॉपी नहीं किया जा सकता।


1

जैसा कि जेवियर लुकास [अत्यंत सहायक] उत्तर में कहा गया है, आप अपने बिल्ड संदर्भ के बाहर एक निर्देशिका से COPY या ADD का उपयोग नहीं कर सकते हैं (जिस फ़ोल्डर से आप "docker build" चलाते हैं, वही निर्देशिका होनी चाहिए जो आपकी .Dockerfile) हो। यहां तक ​​कि अगर आप एक सिमलिंक का उपयोग करने की कोशिश करते हैं, तो भी यह काम नहीं करेगा।

नोट: यह POSIX (लिनक्स, यूनिक्स, मैक, विंडोज के लिए संभवतः लिनक्स सबसिस्टम) के लिए विशिष्ट है। आप JUNCTION का उपयोग करके Windows में समान करने में सक्षम हो सकते हैं।

cd ~/your_docker_project/
cp -al /subfolder/src_directory ./
echo "COPY src_directory /subfolder/" >> Dockerfile

खतरा: इसका उपयोग करने से आपका docker प्रोजेक्ट होस्ट के लिए विशिष्ट हो जाएगा। आप लगभग ऐसा कभी नहीं करना चाहते हैं! ध्यान से संभालें।

अनुप्रयोग: सीखना, एक विकास पर्यावरण में प्रयोग करना

इसने मेरे लिए चाल चली। cp -al डायरेक्टरी स्ट्रक्चर को कॉपी करता है और सभी फाइलों के लिए हार्ड लिंक बनाता है। जब आपको इसे हटाने के लिए "rm -rf ./src_directory" चलाया जाता है।


मेरा उद्देश्य: मेरे स्थानीय फ़ाइल सिस्टम पर कैश्ड पैकेज को मेरी डॉक इमेज में कॉपी करें। मुझे जिन उपकरणों की आवश्यकता है उन्हें स्थापित करें (यह या तो कैश का उपयोग करेगा या इसे नया डाउनलोड करेगा)। फिर मैं छवि में उस कैश को हटा देता हूं और होस्ट पर हार्ड-लिंक हटा देता हूं। यदि होस्ट के पास वे फाइलें नहीं हैं, तो कोई चिंता नहीं है। लेकिन मेरे पास सीमित बैंडविड्थ और सीमित ड्राइव स्पेस है। क्या यह स्वीकार्य उपयोग है?
तमसुराजॉय

1

मैं इस मुद्दे पर चल रहा था और मुझे पता चला कि मैं अन्य निर्देशिकाओं से अपने डॉकरफाइल (ओं) को लोड करने के लिए निर्माण चर में एक संदर्भ जोड़ने में सक्षम था। इसने मुझे अपनी पसंद के हिसाब से अपनी डिफ़ॉल्ट डॉकर फ़ाइल संरचना को थोड़ा और बदलने की अनुमति दी। यहाँ मेरे docker-compose.yml से एक स्निपेट है:

version: '3'
services:
  webserver:
    build:
      context: .
      dockerfile: ./server/Dockerfile
    ...

संदर्भ जोड़कर मैं यह परिभाषित करने में सक्षम था कि फाइलों को कहां संदर्भित किया जाना चाहिए। आप यहां डॉकर डॉक्स का संदर्भ दे सकते हैं: https://docs.docker.com/compose/compose-file/#context

उम्मीद है की यह मदद करेगा!


0

मेरे लिए समस्या यह थी कि जिस फ़ाइलनाम को मैं जोड़ रहा था, वह एक अनुगामी स्थान था। एक नाम ने इसे तय कर दिया।


0

निम्नलिखित त्रुटि के लिए,

COPY failed: stat

मैं docker सेवा को पुनः आरंभ करके इसे प्राप्त कर चुका हूं।


0

मैंने आखिरकार इस मुद्दे को हल कर दिया मेरे मामले में डॉकरीफाइल था कि प्रतिलिपि निष्पादित परियोजना के गहरे स्तर पर थी। इसलिए मैंने महसूस किया कि मेजबान का निर्माण पथ डॉकरीफाइल के फ़ाइल स्थान के सापेक्ष व्यक्त किया गया है।


0

यह मेरे साथ तब हुआ जब एक अलग निर्देशिका से डॉक फ़ाइल चलाने की कोशिश की जा रही है।

मैं COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directoryऔर docker फ़ाइल निर्दिष्ट करके इसे हल करने में कामयाब रहा ।

docker build . -f docker/development/Dockerfileकाम चल रहा है ।

लेकिन Runningडॉक का निर्माण कर डॉक / विकास / डॉकरफाइल 'इस मुद्दे का कारण बना।

-fया --fileका नाम और स्थान निर्दिष्ट करने के लिए Dockerfile

यह पहली बार में अजीब लगा क्योंकि जब मैंने Dockerfileएप्स रूट डायरेक्टरी में यह ठीक काम किया था। यह मदद करेगा यदि आप अपने पर्यावरण docker फ़ाइलों को थोड़ा बेहतर प्रबंधित करना चाहते हैं।


0

न केवल फ़ाइल को वर्तमान बिल्ड संदर्भ में एक निर्देशिका में होना चाहिए, बल्कि फ़ाइल बिल्ड संदर्भ के बाहर किसी फ़ाइल के लिए नरम लिंक नहीं हो सकती है।

मेरे घर निर्देशिका में एक फ़ाइल का लिंक था, और लिंक परियोजना निर्देशिका में था। जब मैंने लिंक को हटा दिया और लिंक की गई फ़ाइल को प्रोजेक्ट में स्थानांतरित कर दिया ( rm mylink ; mv ~/myrealfile ./), तब इसने काम किया।


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