एक डॉकफ़िल में फ़ाइल कॉपी करना, ऐसी कोई फ़ाइल या निर्देशिका नहीं है?


99

मेरे पास मेरे रूट (~) फ़ोल्डर में एक डॉकरीफ़ाइल सेट है। मेरी फ़ाइल की पहली तीन लाइनें इस तरह दिखती हैं:

COPY file1 /root/folder/
COPY file2 /root/folder/
COPY file3 /root/folder/

लेकिन यह प्रत्येक पंक्ति के लिए निम्न त्रुटि देता है:

ऐसी कोई फ़ाइल या डायरेक्टरी नहीं है

फाइलें मेरे डॉकरफाइल के समान निर्देशिका में हैं और मैं docker build - < Dockerfileटर्मिनल में भी उसी निर्देशिका में कमांड चला रहा हूं ।

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


मुझे यह समस्या थी, फिर .dockerignore फ़ाइल को उस फ़ाइल को अनदेखा कर रहा था जिसे मैं कॉपी करने का प्रयास कर रहा था। Jinschubert द्वारा समाधान: github.com/docker/for-mac/issues/1922
JStrahl

जवाबों:


36

में कॉपी अनुदेश Dockerfileप्रतियों में फ़ाइलों srcको destफ़ोल्डर। आप की तरह लग रहा है या तो याद कर रहे हैं file1, file2और file3या बनाने की कोशिश Dockerfileगलत फ़ोल्डर से।

Dockerfile Doc का संदर्भ लें

साथ ही निर्माण की कमान Dockerfileकुछ इस तरह होनी चाहिए।

cd into/the/folder/
docker build -t sometagname .

3
वह दूसरा आदेश मेरे लिए विफल रहता है, कहता है कि "निर्माण" के लिए एक तर्क की आवश्यकता है।
ग्रीनगॉड

ओह - अब cmd को अपडेट करें, इसकी डॉकरीफाइल का उल्लेख करने की आवश्यकता नहीं है।
आस्क

3
मुझे आपके लिंक को ठीक से पढ़ने के बाद पता चला कि DockerFile रूट फ़ोल्डर में बिल्कुल नहीं होना चाहिए। उपनिर्देशिका के लिए सब कुछ ले जाया गया, बिल्ड कमांड को चलाया और यह चलता है। आपका उत्तर सबसे अधिक उपयोगी था इसलिए मैं इसे सही मानूंगा।
ग्रीनगॉड

49
यह भी जांचें कि क्या डॉकटर इग्नोर फाइल है (नहीं)।
टोनी

259

.dockerignoreफाइल भी चेक करो ।

मुझे पता है कि यह एक बहुत ही दुर्लभ मामला है, लेकिन मेरे पास उस फ़ाइल का उल्लेख है।


3
ओह माय गॉड थैंक यू। मैं एक जावा प्रोजेक्ट (और इस तरह ripgrepआर्टिफिशियल और बिल्ड डीआईआर) का नाम बदल रहा था, और डॉटफाइल्स में खोज नहीं करता , इसलिए मैंने पुरानी निर्देशिका के लिए आखिरी पेस्की संदर्भ नहीं देखा।
मार्टिन लेहमैन

4
हेडअप के लिए धन्यवाद, मेरे मामले में मैं डॉक के लिए विजुअल स्टूडियो विज़ार्ड का उपयोग कर रहा था और इसने पहली पंक्ति में * .dockerignore को *:
लैक्रिप्टा

किसी कारण से, मेरे डिफ़ॉल्ट .dockerignore में ** \ bin है। मुझे यकीन है कि यह डॉकर डेस्कटॉप द्वारा उत्पन्न किया गया था।
स्टीव स्मिथ

आह्ह्ग्घ्ग ऐसा लगता है कि ऐसा कोई दुर्लभ मामला नहीं है !!!। विल्नट ने एक लाख वर्षों में इसका पता लगाया। थोड़ी देर पहले निर्देशिका को जोड़ा और पूरी तरह से भूल गया। इसे जोड़ने का कारण यह है कि यह किसी भी निर्माण को बहुत धीमा बनाता है, यह
समझे

1
ओह गंभीरता से, क्या एक त्रुटि है। यह इंगित करने के लिए बहुत बहुत धन्यवाद!
taiBsu

37

यह संभवतः आपके द्वारा फ़ाइल 1 / file2 / file3 को एक निरपेक्ष पथ के रूप में संदर्भित कर रहा है जो निर्माण संदर्भ में नहीं है, डॉकर केवल निर्माण के संदर्भ में पथ खोजता है।

उदाहरण के लिए यदि आप COPY / home / yourname / file1 का उपयोग करते हैं, तो Docker इसका निर्माण $ {docker build working directory} के रूप में करता है। यदि यहां एक ही नाम वाली कोई फ़ाइल नहीं है, तो कोई फ़ाइल या निर्देशिका त्रुटि नहीं है।

एक docker समस्या का संदर्भ लें


पूर्ण पथ समस्या के कुछ प्रकार है, मैं केवल "कॉपी रिश्तेदार / पथ / एक्स" कर सकता हूं। मैं "COPY / निरपेक्ष / पथ / y" नहीं कर सकता, किसी को भी पता है क्यों?
अलेक्जेंडर मिल्स

8
@AlexanderMills Dockerfiles को मेजबान मशीन पर स्वतंत्र रूप से चलाने योग्य माना जाता है और Dockerfile के सापेक्ष पथों में उपलब्ध अतिरिक्त फ़ाइलों के साथ भेज दिया जाता है। निरपेक्ष रास्तों का उपयोग करने से यह केवल आपके मशीन पर चलने योग्य होगा।
kciesielski

यह ADDनिर्देश के साथ मेरी समस्या थी , धन्यवाद।
15

मुझे यह नहीं मालूम था। इसे बदलना ताकि डॉकटराइल के साथ फाइल को शामिल किया गया वास्तव में मेरे लिए पूरी तरह से काम किया। जब मैंने इसे किसी अन्य स्रोत स्थान (पूर्ण पथ जैसे / dir / dir2 / फ़ाइल के रूप में) से लिया था तो यह काम नहीं कर रहा था। यह काम करता है अगर यह कुछ निर्देशिका में dockerfile के रूप में है या यह बच्चे हैं
Newteq Developer

22

लगता है कि आदेश:

docker build -t imagename .

तथा:

docker build -t imagename - < Dockerfile2

उसी तरह निष्पादित नहीं किए जाते हैं। यदि आप Dockerfile और Dockerfile2 के साथ एक फ़ोल्डर में 2 docker छवियाँ बनाना चाहते हैं, तो COPY कमांड को दूसरे उदाहरण में stdin (<Dockerfile2) का उपयोग नहीं किया जा सकता है। इसके बजाय आपको उपयोग करना होगा:

docker build -t imagename -f Dockerfile2 .

फिर COPY उम्मीद के मुताबिक काम करता है।


18

रनिंग docker build . -f docker/development/Dockerfileकाम किया है, जो आपको अपने एप्लिकेशन के रूट के अलावा एक निर्दिष्ट निर्देशिका से अपनी डॉक फ़ाइल चलाने की अनुमति देता है।

के नाम और स्थान का उपयोग करें -fया --fileनिर्दिष्ट करें Dockerfile

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

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

यह docker build docker/development/Dockerfileमेरे लिए इस मुद्दे का कारण था ।

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


1
docker build . -f docker/development/Dockerfileयह काम करता है
प्रदीप सुराले

1
बहुत-बहुत धन्यवाद - इसने भी मेरे लिए काम किया। यह मुझे पागल बना रहा था।
x0n

4

मैंने बस इस समस्या का अनुभव किया और यहाँ किसी भी सुझाव ने मेरी समस्या का समाधान नहीं किया। यह बताता है कि मेरी फाइल में गलत लाइन एंडिंग थी, और उन्हें उपयुक्त लाइन एंडिंग में बदलना पड़ा। (इस मामले में CRLF से LF तक, इसलिए Ubuntu 14.04 स्क्रिप्ट को पहचान लेगा, जिसे मैं विंडोज़ पर एडिट कर रहा था।)

मैंने VSCode का उपयोग करके लाइन एंडिंग को बदल दिया, और अधिकांश कोड संपादकों को लाइन एंडिंग चुनने का विकल्प होना चाहिए।

आशा है कि यह किसी की मदद करता है।


हां, इससे मदद मिली :)
रॉबर्ट स्मिथ

3

मैं थोड़ा बेवकूफ महसूस करता हूं, लेकिन मेरा मुद्दा यह था कि मैं डॉकटर-कंपोज कर रहा था, और मेरा डॉकफाइल एक ./eploy subdirectory में था। मेरे एडीडी संदर्भ को परियोजना की जड़ के सापेक्ष होने की आवश्यकता है, न कि डॉकरफाइल की।

परिवर्तित: ADD। /File.tar.gz / etc / folder / to: ADD ./deploy/file.tar.gz / etc / folder /

किसी भी तरह, सोचा था कि मैं उसी मामले में किसी के भाग जाने की स्थिति में पोस्ट करूंगा।


3

यहाँ समाधान और सबसे अच्छा अभ्यास है:

आपको एक संसाधन फ़ोल्डर बनाने की आवश्यकता है जहां आप अपनी सभी फ़ाइलों को कॉपी करना चाहते हैं।

├── Dockerfile
│   └── resources
│       ├── file1.txt
│       ├── file2.js

फ़ाइलों की प्रतिलिपि बनाने की कमान इस तरह से निर्दिष्ट की जानी चाहिए:

COPY resources /root/folder/

कहाँ पे

* संसाधन - आपका स्थानीय फ़ोल्डर जिसे आपने उसी फ़ोल्डर में बनाया है जहाँ डॉकरफ़ाइल है

* आपके कंटेनर में रूट / फोल्डर / फोल्डर


2

मुझे पता है कि यह पुराना है, लेकिन कुछ कहना है। यदि आपको लगता है कि सब कुछ जैसा कि होना चाहिए था, अपनी .gitignore फ़ाइल की जाँच करें :)

आपके पास फ़ोल्डर स्थानीय रूप से हो सकता है, लेकिन यदि फ़ोल्डर आपके गिट अनदेखी में है, तो सर्वर पर नहीं है, जिसका अर्थ है कि डॉकर को वह फ़ोल्डर नहीं मिल सकता है क्योंकि यह मौजूद नहीं है।


1

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

COPY failed: stat /<**path**> :no such file or directory

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

sudo service docker restart

1

फ़ाइल को डॉकर put_archive के साथ त्रुटि नहीं मिली। मैं डॉकटर के लिए पायथन एपीआई का उपयोग कर रहा हूं। डॉकर संस्करण 1.12.5, 7392c3b का निर्माण करें

docker.errors.NotFound: 404 Client Error: Not Found ("lstat /var/lib/docker/aufs/mnt/39d58e00519ba4171815ee4444f3c43d2c6a7e285102747398f6788e39ee0e87/var/lib/neo4j/certificates: no such file or directory")

मैं बनाए गए डॉकटर कंटेनर में फ़ाइलों को कॉपी करने में असमर्थ हूं।

con = cli.create_container(...)
cli.put_archive(...)
cli.start(con['Id'])

अगर मैं ऑपरेशन के क्रम को बदलता हूं तो कोई त्रुटि नहीं है और फाइलें बिल्कुल उसी तरह कॉपी की जाती हैं जैसे मैं उन्हें चाहता हूं। इसलिए मुझे पता है कि मेरा कोड काम कर रहा है और मैं जो करना चाहता हूं वह कर रहा हूं। लेकिन कॉन्फ़िगरेशन फ़ाइलों को कॉपी करने से पहले इसे शुरू करना महत्वपूर्ण है। स्टार्ट होने के बाद फाइलों को कॉपी करना कंटेनर को डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ शुरू करना है न कि कस्टम कॉन्फ़िगरेशन को जो कंटेनर को शुरू करने से पहले कॉपी करने की आवश्यकता है। डॉकर का दावा है कि यह मुद्दा बंद है लेकिन यह अभी भी मेरे आवेदन को प्रभावित कर रहा है।

यह काम; समान कोड अलग-अलग निष्पादन आदेश।

con = cli.create_container(...)
cli.start(con['Id'])
cli.put_archive(...)

1

: यदि आप सुनिश्चित करें कि आप सही काम किया है, लेकिन अभी भी डोकर शिकायत करता है, इस मुद्दे पर एक नज़र डालें https://github.com/moby/moby/issues/27134
मैं इस से जल गया, और ऐसा लगता है कि docker इंजन service docker restartको पुनः आरंभ करने से यह समस्या ठीक हो जाएगी।


1

मैं इस पर एक फिक्स के लिए खोज कर रहा था और मैं फ़ोल्डर ADD था या COPY'ing बिल्ड फ़ोल्डर में नहीं था, ऊपर कई निर्देशिकाएं या से संदर्भित /

बिल्ड फ़ोल्डर के बाहर से फ़ोल्डर ले जाना बिल्ड फ़ोल्डर में मेरी समस्या तय की।


1

स्टडिन का उपयोग न करने और संदर्भ रखने का एक तरीका यह है:

1) अपने डॉकरफाइल में, आपको जोड़ना चाहिए

ADD /your_dir_to_copy /location_in_container

2) के बाद, आपको / your_dir_to_copy dir के मूल पर जाना चाहिए

2) फिर इस कमांड को रन करें

sudo docker build . -t (image/name) -f path_of_your_dockerfile/Dockerfile

3) अपने कंटेनर बनाने के बाद

docker run -ti --rm cordova bash

4) के बाद आप अपने निर्देशिका अपने कंटेनर में नकल मिल जाएगा


1

COPY पर पिछली कॉल निर्देशिका को बदल सकती हैं।

COPY ./server/package.json ./server      # this passes, but the dest ./server is considered a file

COPY ./server/dist ./server/dist         # error, ./server/dist is not a directory

पहली कॉल में एक अनुगामी स्लैश जोड़ें

COPY ./server/package.json ./server/

1

मैं इसमें भाग गया। कुछ निर्देशिकाओं की नकल करने से काम नहीं चला। फाइलों की नकल की। यह पता चला है क्योंकि .gitignore (न सिर्फ .dockerignore) में निहित फ़ाइलों को भी अनदेखा किया जाता है। देखें: https://github.com/zeit/now/issues/790


कॉपी करने में असफल होने के लिए दर्जनों संदर्भ - यह .dockerignoreएक अपराधी के रूप में संदर्भ के लिए कुछ में से एक है
एल्विन

1

इसी तरह और tslegaitis के जवाब के लिए धन्यवाद , के बाद

gcloud builds submit --config cloudbuild.yaml . 

यह दिखाता है

Check the gcloud log [/home/USER/.config/gcloud/logs/2020.05.24/21.12.04.NUMBERS.log] to see which files and the contents of the
default gcloudignore file used (see `$ gcloud topic gcloudignore` to learn
more).

उस लॉग की जाँच करते हुए, यह कहता है कि docker उपयोग करेगा .gitignore:

DATE Using default gcloudignore file:
# This file specifies files that are *not* uploaded to Google Cloud Platform
# using gcloud. It follows the same syntax as .gitignore, with the addition of
# "#!include" directives (which insert the entries of the given .gitignore-style
# file at that point).
# ...

.gitignore

इसलिए मैंने अपना तय किया .gitignore(मैं इसके बजाय श्वेतसूची का उपयोग करता हूं) और डॉकटर ने फाइल की नकल की।

[मैंने उत्तर इसलिए जोड़ा क्योंकि मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है]


1

मुझे यह समस्या तब भी थी जब मेरे स्रोत निर्देशिका सही बिल्ड संदर्भ में थे। कारण यह पाया गया कि मेरी स्रोत निर्देशिका बिल्ड संदर्भ के बाहर किसी स्थान का प्रतीकात्मक लिंक थी।

उदाहरण के लिए मेरे डॉकफाइल में निम्नलिखित शामिल हैं:

COPY dir1 /tmp

यदि dir1एक प्रतीकात्मक कड़ी है तो COPYकमान मेरे मामले में काम नहीं कर रही है।


0

तो यह हाल ही में एक दो बार हुआ है। एक नेट देव के रूप में, VisualStudio मैं का उपयोग करने से अपने निर्माण नाम बदल दिया है SomeThingकरने के लिए SomethingDLL नाम के रूप में, लेकिन यह .csproj फ़ाइल जो रहता परिवर्तन नहीं करता हैSomeThing.csproj

Dockerfile linux केस-संवेदी फ़ाइल नाम का उपयोग करता है, इसलिए नव ऑटोजेनरेटेड Dockerfile को कॉपी करने की कोशिश कर रहा था, Something.csprojजो इसे नहीं मिल सका। तो मैन्युअल रूप से उस फ़ाइल का नाम बदलकर (इसे कम करके) यह सब काम कर गया

लेकिन ... यहाँ एक चेतावनी चेतावनी है। मेरे विंडोज लैपटॉप पर यह फ़ाइल नाम परिवर्तन Git द्वारा नहीं उठाया गया है, इसलिए रेपो स्रोत अभी भी SomeThing.csprojरेपो पर था और CI / CD प्रक्रिया के दौरान, डॉकर बिल्ड समान कारणों से विफल रहा ...

मुझे रेपो पर एक कमिट के रूप में सीधे फिल्म का नाम बदलना पड़ा .... बुरा सा वर्कअराउंड लेकिन मुझे मिल गया

tl; dr अगर विंडोज ओ / एस पर फ़ाइल नाम मामले की संवेदनशीलता के लिए जाँच करें और जागरूक रहें स्थानीय फ़ाइल का नाम नहीं लिया गया तो गिट परिवर्तन के रूप में उठाएं ताकि सुनिश्चित करें कि आपके रेपो को भी संशोधित किया गया है यदि सीआई / सीडी का उपयोग कर रहे हैं


0

कुछ शानदार जवाब यहाँ पहले से ही। मेरे लिए जो काम किया, वह टिप्पणी को अगली पंक्ति में ले जाना था।

BAD :

WORKDIR /tmp/app/src # set the working directory (WORKDIR), so we can reference program directly instead of providing the full path.
COPY src/ /tmp/app/src/ # copy the project source code

अच्छा :

WORKDIR /tmp/app/src
  # set the working directory (WORKDIR), so we can reference program directly instead of providing the full path.
COPY src/ /tmp/app/src/
  # copy the project source code
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.