একটি ডকফাইলে একটি ফাইলের কপি করা, এমন কোনও ফাইল বা ডিরেক্টরি নেই?


98

আমার রুট (~) ফোল্ডারে আমার একটি ডকফাইফাইল সেট আপ আছে। আমার ফাইলের প্রথম তিনটি লাইন দেখতে এইরকম:

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

তবে এটি প্রতিটি লাইনের জন্য নিম্নলিখিত ত্রুটিটি প্রদান করে:

অনুরূপ কোন ফাইল বা ডিরেক্টরি নেই

ফাইলগুলি আমার ডকফেরফাইলের মতো একই ডিরেক্টরিতে রয়েছে এবং আমি docker build - < Dockerfileএকই ডিরেক্টরিতে টার্মিনালেও কমান্ড চালাচ্ছি ।

আমি এখানে ঠিক কী করছি?


আমার এই সমস্যাটি ছিল, তারপরে লক্ষ্য করুন যে .dockerignore ফাইলটি অনুলিপি করছে যে ফাইলটি আমি অনুলিপি করার চেষ্টা করছি। জিনসুবার্ট দ্বারা সমাধান: github.com/docker/for-mac/issues/1922
JStrahl

উত্তর:


35

কপি নির্দেশ Dockerfileকপি ফাইল srcথেকে destফোল্ডার। তোমার মত দেখতে পারেন অনুপস্থিত file1, file2এবং file3অথবা গড়ে তোলার চেষ্টা Dockerfileভুল ফোল্ডার থেকে।

ডকফেরফিল ডকটি উল্লেখ করুন

এছাড়াও কমান্ডটি নির্মাণের জন্য Dockerfileকিছু হওয়া উচিত।

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

4
দ্বিতীয় কমান্ডটি আমার জন্য ব্যর্থ হয়েছে, বলে যে "বিল্ড" এর একটি যুক্তি প্রয়োজন।
গ্রিনগোডট

ওহ - এখনই সেন্টিমিডি আপডেট করুন, ডকফাইফিলের উল্লেখ করার প্রয়োজন নেই।

4
আপনার লিঙ্কটি সঠিকভাবে পড়ার পরে আমি জানতে পেরেছিলাম যে ডকারফিল মোটেও রুট ফোল্ডারে থাকা উচিত নয়। সাব-ডাইরেক্টরিতে সবকিছু সরিয়ে নিয়েছে, বিল্ড কমান্ডটি চালিয়েছে এবং এটি চলে। আপনার উত্তর সর্বাধিক সহায়ক ছিল তাই আমি এটিকে সঠিক হিসাবে চিহ্নিত করব।
গ্রিনগোডট

49
কোনও ডকার উপেক্ষা করুন ফাইল আছে কিনা তাও পরীক্ষা করে দেখুন।
টনি

259

.dockerignoreফাইলটিও পরীক্ষা করে দেখুন ।

আমি জানি এটি খুব বিরল ঘটনা, তবে আমার সেই ফাইলটি সেখানে উল্লেখ করা হয়েছে।


4
ওহ আমার youশ্বর আপনাকে ধন্যবাদ। আমি একটি জাভা প্রকল্পের নাম পরিবর্তন করছিলাম (এবং এইভাবে কৃত্রিম এবং বিল্ড দির), এবং ripgrepডটফাইলে অনুসন্ধান করি না তাই আমি পুরানো ডিরেক্টরিটির শেষ প্রান্তিক রেফারেন্সটি দেখতে পাইনি।
মার্টিন লেহম্যান

4
হেডআপের জন্য ধন্যবাদ, আমার ক্ষেত্রে আমি ডকারের জন্য ভিজ্যুয়াল স্টুডিও উইজার্ড ব্যবহার করছিলাম এবং এটি প্রথম লাইনে * দিয়ে একটি ডকিরাইনরে যুক্ত করেছে :(
ল্যাপিটা

কোনও কারণে, আমার ডিফল্ট। ডকিরাইনরে এর মধ্যে ** \ বিন রয়েছে। আমি নিশ্চিত এটি ডকার ডেস্কটপ দ্বারা উত্পাদিত হয়েছিল।
স্টিভ স্মিথ

অহঃহঃগঃ মনে হয় এরকম বিরল কেস আর হয় না !!! এক মিলিয়ন বছরে এটি বের করতে পারত না। ডিরেক্টরিটি কিছুক্ষণ আগে যুক্ত হয়েছিল এবং সম্পূর্ণরূপে ভুলে গিয়েছিল। এটি যুক্ত হওয়ার কারণটি যে কোনও
বিল্ডকে

4
ওহ গম্ভীরভাবে, এটি কি ত্রুটি। যে নির্দেশ করে জন্য অনেক ধন্যবাদ!
তাইবসু

37

এটি সম্ভবত আপনি ফাইল 1 / ফাইল 2 / ফাইল 3 কে নিরঙ্কুশ পথ হিসাবে উল্লেখ করছেন যা বিল্ড প্রসঙ্গে নয়, ডকার কেবল বিল্ড প্রসঙ্গেই অনুসন্ধান করুন।

উদাহরণস্বরূপ আপনি যদি সিপিওয়াই / হোম / আপনার নাম / ফাইল 1 ব্যবহার করেন তবে ডকার বিল্ড এটিকে {ock ডকার বিল্ড ওয়ার্কিং ডিরেক্টরি} / হোম / আপনার নাম / ফাইল 1 হিসাবে ব্যাখ্যা করে, যদি এখানে একই নামের কোনও ফাইল না থাকে তবে কোনও ফাইল বা ডিরেক্টরি ত্রুটি নিক্ষেপ করা হয় না।

পড়ুন Docker ইস্যু এক


এখানে এক ধরণের নিখুঁত পাথ সমস্যা আছে, আমি কেবল "আপেক্ষিক / পথ / এক্স কপি" করতে পারি। আমি "কপি / পরম / পথ / ওয়াই" করতে পারি না, কেন কেউ জানেন?
আলেকজান্ডার মিলস

8
@ আলেকজান্ডারমিলস ডকফিলসগুলি হোস্ট মেশিনে স্বতন্ত্রভাবে চলমান হবে এবং ডকফাইফিলের সাথে সম্পর্কিত পথে অতিরিক্ত ফাইলগুলি সরবরাহ করার কথা রয়েছে। পরম পাথগুলি ব্যবহার করা কেবল আপনার মেশিনে এটি চলমান n
kciesielski

ADDনির্দেশনার সাথে আমার সমস্যাটিও ছিল , ধন্যবাদ।
vmonteco

আমি এটা জানতাম না। এটিকে পরিবর্তন করা যাতে ডকফাইফিলের পাশাপাশি ফাইলটি আমার অন্তর্ভুক্ত ছিল perfectly যখন আমি এটি অন্য কোনও উত্সের অবস্থান থেকে পেয়েছি (সম্পূর্ণ পথ হিসাবে যেমন / dir / dir2 / file) এটি কাজ করছে না। এটি কোনও ডিরেক্টরিতে ডকফাইফাইল বা এটির শিশুদের হিসাবে কাজ করে
নিউটেক বিকাশকারী

22

আদেশগুলি মনে হয়:

docker build -t imagename .

এবং:

docker build -t imagename - < Dockerfile2

একইভাবে কার্যকর করা হয় না। যদি আপনি ডকফিলিলে এবং ডকফিলিলে 2 দিয়ে একটি ফোল্ডারের মধ্যে 2 ডকার চিত্র তৈরি করতে চান, তবে কপি কমান্ডটি স্ট্যান্ডিন (<ডকফেরফাইল 2) ব্যবহার করে দ্বিতীয় উদাহরণে ব্যবহার করা যাবে না। পরিবর্তে আপনাকে ব্যবহার করতে হবে:

docker build -t imagename -f Dockerfile2 .

তারপরে কপি প্রত্যাশার মতো কাজ করে।


17

চলমান docker build . -f docker/development/Dockerfileকাজ, যা আপনাকে আপনার অ্যাপ্লিকেশনটির মূল বাদে কোনও নির্দিষ্ট ডিরেক্টরি থেকে আপনার ডকার ফাইল চালানোর অনুমতি দেয়।

নাম এবং অবস্থান নির্দিষ্ট করতে ব্যবহার করুন -fবা ।--fileDockerfile

অন্য ডিরেক্টরি থেকে ডকার ফাইল চালানোর চেষ্টা করার সময় আমার সাথে এটি ঘটেছিল।

আমি COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directoryডকার ফাইলটি নির্দিষ্ট করে সমাধান করেছি এবং এটি সমাধান করেছি।

এটিই ছিল docker build docker/development/Dockerfileআমার জন্য এই সমস্যাটি।

আমি প্রথমে এটি অদ্ভুত বলে মনে করেছি কারণ আমি যখন Dockerfileঅ্যাপস রুট ডিরেক্টরিতে ছিলাম তখন এটি ঠিকঠাক কাজ করেছিল। আপনি যদি আপনার পরিবেশ ডকার ফাইলগুলি আরও ভালভাবে পরিচালনা করতে চান তবে এটি সহায়তা করবে।


4
docker build . -f docker/development/Dockerfileএই কাজ করে
প্রদীপ সুরলে

4
আপনাকে অনেক ধন্যবাদ - এটি আমার পক্ষেও কাজ করেছিল। এটা আমাকে পাগল করে চলেছে
x0n

4

আমি সবেমাত্র এই সমস্যাটি অনুভব করেছি এবং এখানের যে কোনও পরামর্শই আমার সমস্যার সমাধান করেনি। দেখা যাচ্ছে আমার ফাইলে আমার ভুল লাইন এন্ডিংস ছিল এবং সেগুলি যথাযথ লাইনের শেষ পর্যন্ত পরিবর্তন করতে হয়েছিল। (এই ক্ষেত্রে সিআরএলএফ থেকে এলএফ পর্যন্ত, তাই উবুন্টু 14.04 স্ক্রিপ্টটি চিনতে পারে, যা আমি উইন্ডোতে সম্পাদনা করছিলাম।)

আমি ভিএসকোড ব্যবহার করে লাইন এন্ডিংগুলি পরিবর্তন করেছি এবং বেশিরভাগ কোড সম্পাদকের কাছে লাইন এন্ডিংগুলি বেছে নেওয়ার বিকল্প থাকা উচিত।

আশা করি এটি কাউকে সাহায্য করবে।


হ্যাঁ, এটি সাহায্য করেছিল :)
রবার্ট স্মিথ

3

আমি কিছুটা বোকা বোধ করছি তবে আমার সমস্যাটি হ'ল আমি ডকার-কমপোজ চালিয়ে যাচ্ছিলাম এবং আমার ডকফাইফিল একটি ./deploy উপ-ডিরেক্টরিতে ছিল। আমার এডিডি রেফারেন্সটি প্রকল্পের মূলের সাথে সম্পর্কিত হতে হবে, ডকফাইফিলের সাথে নয়।

পরিবর্তন করা হয়েছে: ADD ./file.tar.gz / etc / ফোল্ডার / এ: ADD ./deploy/file.tar.gz / etc / ফোল্ডার /

যাইহোক, ভেবেছিলাম কেউ যদি একই সমস্যা নিয়ে চলে যায় তবে আমি পোস্ট করব।


3

সমাধান এবং সর্বোত্তম অনুশীলন এখানে:

আপনাকে এমন একটি সংস্থান ফোল্ডার তৈরি করতে হবে যেখানে আপনি অনুলিপি করতে চান এমন সমস্ত ফাইল রাখতে পারেন।

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

ফাইলগুলি অনুলিপি করার জন্য আদেশটি এইভাবে নির্দিষ্ট করা উচিত:

COPY resources /root/folder/

কোথায়

* সংস্থানসমূহ - আপনার স্থানীয় ফোল্ডার যা আপনি একই ফোল্ডারে তৈরি করেছেন যেখানে ডকফেরফাইল রয়েছে

আপনার পাত্রে * / রুট / ফোল্ডার / - ফোল্ডার


2

আমি জানি এটি পুরানো, তবে কিছু উল্লেখ করার মতো। আপনি যদি মনে করেন যে সবকিছু ঠিকঠাক হিসাবে অনুমান করা হয় তবে আপনার .gitignore ফাইলটি পরীক্ষা করুন :)

আপনার স্থানীয়ভাবে ফোল্ডারটি থাকতে পারে, তবে ফোল্ডারটি যদি আপনার গিট এড়িয়ে যায় তবে এটি সার্ভারে নেই, যার অর্থ ডকর সেই ফোল্ডারটি খুঁজে পায় না কারণ এটি বিদ্যমান নেই।


1

নিম্নলিখিত ত্রুটির জন্য,

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

আমি ডকার পরিষেবাটি পুনরায় চালু করে এটি পেয়েছিলাম।

sudo service docker restart

1

ফাইল ডকার পুটআরাইভের সাথে ত্রুটি খুঁজে পাওয়া যায় নি। আমি ডকারের জন্য পাইথন এপিআই ব্যবহার করছি। ডকার সংস্করণ 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'])

যদি আমি অপারেশনের ক্রম পরিবর্তন করি তবে কোনও ত্রুটি নেই এবং ফাইলগুলি হুবহু নকল করা হয়েছে আমি চাইছিলাম। সুতরাং আমি জানি যে আমার কোডটি কাজ করছে এবং যা করতে চাই তা করছে। তবে কনফিগারেশন ফাইলগুলি এটি শুরু হওয়ার আগেই কোনও ধারকটিতে অনুলিপি করা গুরুত্বপূর্ণ। শুরুর পরে ফাইলগুলি কপি করে কনটেইনারটিকে একটি ডিফল্ট কনফিগারেশন দিয়ে শুরু করে এবং কাস্টম কনফিগারেশন নয় যা ধারকটি শুরু হওয়ার আগে জায়গায় অনুলিপি করা দরকার not ডকার দাবি করেছেন যে এই সমস্যাটি বন্ধ রয়েছে তবে এটি এখনও আমার প্রয়োগকে প্রভাবিত করছে।

এইটা কাজ করে; একই কোড বিভিন্ন কার্যকর আদেশ।

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

1

আপনি যদি নিশ্চিত হন যে আপনি সঠিক কাজটি করেছেন তবে ডক এখনও অভিযোগ করেন, এই সমস্যাটি একবার দেখুন: https://github.com/moby/moby/issues/27134
আমি এতে জ্বলে উঠলাম এবং মনে হচ্ছে ডকার ইঞ্জিন পুনরায় চালু করা service docker restartঠিক এই সমস্যাটি ঠিক করবে।


1

আমি এটির জন্য একটি সন্ধান করছি এবং আমি যে ফোল্ডারটি অ্যাড বা কপি করেছি সেগুলি বিল্ড ফোল্ডারে ছিল না, উপরে একাধিক ডিরেক্টরি বা / থেকে রেফারেন্স করা হয়েছে

বিল্ড ফোল্ডারের বাইরে থেকে ফোল্ডারটি বিল্ড ফোল্ডারে সরানো আমার সমস্যাটি স্থির করেছে।


1

স্টিডিন ব্যবহার না করার এবং প্রসঙ্গটি রাখার একটি উপায় হ'ল:

1) আপনার ডকফাইলে, আপনার যুক্ত করা উচিত

ADD /your_dir_to_copy /location_in_container

2) পরে, আপনার / আপনার_ডির_ টো_কপি ডিরের পিতামাতার কাছে যাওয়া উচিত

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/ હવે/ 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).

এই লগটি চেক করে, এটি বলছে যে ডকার ব্যবহার করবে .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

আমার উত্স ডিরেক্টরিটি সঠিক বিল্ড প্রসঙ্গে থাকলেও আমার এই সমস্যাটি ছিল had কারণটি খুঁজে পেয়েছিল যে আমার উত্স ডিরেক্টরিটি বিল্ড প্রসঙ্গে বাইরের কোনও অবস্থানের প্রতীকী লিঙ্ক ছিল।

উদাহরণস্বরূপ, আমার ডকফাইফিলের মধ্যে নিম্নলিখিত রয়েছে:

COPY dir1 /tmp

যদি dir1একটি প্রতীকী লিঙ্ক হয় তবে COPYকমান্ডটি আমার ক্ষেত্রে কাজ করছে না।


0

সুতরাং এটি সম্প্রতি কয়েকবার ঘটেছে। একটি নেট দেব হিসাবে, VisualStudio আমি ব্যবহার থেকে আমার build নাম পরিবর্তন SomeThingকরতে Somethingডিএলএল নামের কিন্তু এই .csproj ফাইল যা থাকার বিষয়টি মতেই পরিবর্তন করে নাSomeThing.csproj

ডকফাইফাইল লিনাক্স কেস-সংবেদনশীল ফাইলের নাম ব্যবহার করে, তাই নতুন স্বয়ংক্রিয়ভাবে জড়িত ডকফেরফিলটি অনুলিপি করার চেষ্টা করেছিল Something.csprojযা এটি খুঁজে পায়নি । সুতরাং ম্যানুয়ালি সেই ফাইলটির নাম পরিবর্তন করে (এটিকে ছোট হাতের অক্ষরে তৈরি করা) এটি সমস্ত কাজ করে

তবে ... এখানে একটি সতর্কতা সতর্কতা। আমার উইন্ডোজ ল্যাপটপে এই ফাইলের নাম পরিবর্তনটি গিট দ্বারা গ্রহণ করা যায় না তাই রেপো উত্স এখনও SomeThing.csprojরেপোতে ছিল এবং সিআই / সিডি প্রক্রিয়া চলাকালীন, ডকার বিল্ড একই কারণে ব্যর্থ হয়েছিল ...

রেপোর প্রতিশ্রুতি হিসাবে আমাকে ফাইলের নামটি সরাসরি পরিবর্তন করতে হয়েছিল .... দুষ্টু ছোট্ট কাজ কিন্তু আমাকে যেতে বাধ্য করল

tl; dr যদি উইন্ডোজ ও / এস-তে ফাইলের নাম সংবেদনশীলতার জন্য পরীক্ষা করে থাকেন এবং সচেতন হন স্থানীয় ফাইলের নামগুলি গিট পরিবর্তন হিসাবে বেছে নেওয়া হয় না তাই সিআই / সিডি ব্যবহার করে আপনার রেপোও সংশোধিত হয়েছে তা নিশ্চিত করুন


0

ইতিমধ্যে এখানে কিছু দুর্দান্ত উত্তর। আমার জন্য কী কাজ করেছিল তা ছিল পরবর্তী মন্তব্যে মন্তব্যগুলি সরিয়ে নেওয়া।

খারাপ :

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.