খুব বড় ডকারের চিত্রের জন্য প্রসঙ্গ তৈরি করুন


141

আমি আমার হোস্ট মেশিনে বেশ কয়েকটি পৃথক ডিরেক্টরি তৈরি করেছি যেহেতু আমি আমার ডকফায়াইলগুলিকে সুসংহত রাখার জন্য ডকার সম্পর্কে শেখার চেষ্টা করি। আমার ডকফাইফাইল আমি সবেমাত্র দৌড়ে এসেছি:

FROM crystal/centos
MAINTAINER crystal

ADD ./rpms/test.rpm ./rpms/ 
RUN yum -y --nogpgcheck localinstall /rpms/test.rpm 

আমার আসল আরপিএমটি মাত্র 1 জিবি। তবে আমি যখন চেষ্টা করার চেষ্টা করি তখন আমি sudo docker build -t="crystal/test" .ডকার ডেমন 3.5 গিগাবাইটে বিল্ড কনটেক্সট প্রেরণ করি। আপনি ডকার ইমেজগুলি চালিয়ে যেতে থাকায় এমন কি আরও কিছু আছে যা সম্পর্কে আমি অজানা? আমি আমার হোস্ট মেশিনে আমার অন্যান্য ডিরেক্টরিতে আরও চিত্র তৈরি করার সাথে সাথে কি আমার স্মৃতি জমে যাচ্ছে?


2
বিল্ড প্রসঙ্গটি হ'ল বর্তমান ডিরেক্টরিতে থাকা সমস্ত ফাইল / ডিরেক্টরি।
নবীন

এই ডিরেক্টরিতে বিল্ড করার জন্য আপনার প্রয়োজনীয় ফাইলগুলি রাখুন। এটি হ'ল ডকফাইফাইল এবং যে কোনও স্থানীয় ফাইল / ডিরেক্টরিগুলি ডকফাইলে বিল্ড ইমেজে অনুলিপি / যুক্ত হয়েছে। এছাড়াও, ব্যবহার করতে.dockerignore
Vishrant

উত্তর:


265

ডকার ক্লায়েন্ট পুরো "বিল্ড প্রসঙ্গে" ডকার ডিমনকে প্রেরণ করে। সেই বিল্ড কনটেক্সটটি (ডিফল্টরূপে) সম্পূর্ণ ডিরেক্টরিটি Dockerfileযাতে থাকে (তাই, পুরো rpmsগাছ)।

.dockerignoreডকারকে কিছু ফাইল উপেক্ষা করার জন্য আপনি একটি ফাইল সেটআপ করতে পারেন । আপনি এটির সাথে পরীক্ষা করতে চাইতে পারেন।

বিকল্পভাবে, আপনি আপনার rpmsফোল্ডারটিকে আপনার ডিরেক্টরিগুলির উপরে একটি ডিরেক্টরি স্তর থেকে সরিয়ে নিতে পারেন Dockerfile, এবং কেবলমাত্র ডিরেক্টরিতে ডিরেক্টরিতে সিমলিংক test.rpmকরতে পারেন Dockerfile


হিসাবে অনেক ব্যবহারকারী মন্তব্যের নির্দিষ্ট, এর এক চাহিদা যোগ .gitফোল্ডার.dockerignore > আমার ক্ষেত্রে 5GB পার্থক্য - যা একটি 150MB কারণ ছিল।


4
দুর্ভাগ্যক্রমে মনে হয় যে এই ক্ষেত্রে সিমলিংকিং সম্ভব নয় যেহেতু ADDকমান্ডটি কোনও বিল্ডের সময় সিম লিঙ্কগুলি অনুসরণ করে না। দেখুন: github.com/docker/docker/issues/1676
জিমিদীজু

5
লাইফসেভার! নিশ্চিত যোগ করার জন্য পরামর্শ দেওয়া হচ্ছে: ডেভেলপারদের পাগল tmp logকরার .dockerignore+ + অন্যান্য কাস্টম বেশী
equivalent8

7
.dockerignore ফাইলে .git ফোল্ডার যুক্ত করতে ভুলবেন না (আপনি গিট ব্যবহার করছেন বলে ধরে
নিচ্ছেন

8
হ্যাঁ, .gitফোল্ডারটি ডিফল্টরূপে অন্তর্ভুক্ত রয়েছে - এটি অবশ্যই আমাকে ধরা দিয়েছে।
পল সুর্ট

1
"বিল্ড কনটেক্সট" ঠিক কী? আমি ডকার বিল্ড আরএন কমান্ডটি ব্যবহার করে এই ফাইলগুলি সন্ধান করার চেষ্টা করেছি, তবে ডকার ফাইলসিস্টেমের অভ্যন্তরে আমার ডকরিফিল ফোল্ডারে ফাইলগুলি দেখতে পাচ্ছি না (বিল্ড সময়কালে)) কেউ দয়া করে কী আমাকে বিল্ড প্রসঙ্গটি কার্যকর তা একটি সাধারণ উদাহরণ দিতে পারেন?
প্যাট্রিক

52

2019 আপডেট করুন

ডকার ভি 18.06 থেকে শুরু করে বিল্ড কিট নামে একটি নতুন চিত্র নির্মাতা ব্যবহার করার বিকল্প রয়েছে ।

এটি ডকারের সাথে প্রাক-বান্ডিল রয়েছে, কিছু ইনস্টল করার দরকার নেই। এটি Dockerfileসিনট্যাক্সের সাথে পিছনে সামঞ্জস্যপূর্ণ , পরিবর্তন করার দরকার নেই Dockerfile

লিগ্যাসি ডকার বিল্ড বনাম নতুন ডকার বিল্ডকিট

এখানে বিল্ড ডিরেক্টরিতে একটি বিশাল অব্যবহৃত ফাইল সহ একটি চিত্র তৈরির উদাহরণ রয়েছে:

লিগ্যাসি ডকার বিল্ড:

$ time docker image build --no-cache .
Sending build context to Docker daemon  4.315GB
[...]
Successfully built c9ec5d33e12e

real    0m51.035s
user    0m7.189s
sys 0m10.712s

নতুন ডকার বিল্ডকিট:

$ time DOCKER_BUILDKIT=1 docker image build --no-cache .
[+] Building 0.1s (5/5) FINISHED                                                
 => [internal] load build definition from Dockerfile                       0.0s
 => => transferring dockerfile: 37B                                        0.0s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
[...]
 => => writing image sha256:ba5bca3a525ac97573b2e1d3cb936ad50cf8129eedfa9  0.0s

real    0m0.166s
user    0m0.034s
sys 0m0.026s

একমাত্র পরিবর্তন হ'ল DOCKER_BUILDKIT=1পরিবেশ পরিবর্তনশীল, সময়ের পার্থক্য বিশাল।

.dockerignore ফাইল

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


1
এটি লক্ষণীয় গুরুত্বপূর্ণ যে DOCKER_BUILDKIT বর্তমানে উইন্ডোজ কনটেইনারগুলির জন্য সমর্থিত নয়। (কেবল লিনাক্স, সীমাবদ্ধতার অধীনে তালিকাভুক্ত: ডকস.ডোকার / ডেভেলপ / ডেভলপ-ইমেজস / বিল্ড_ইনহেসমেন্টস )
ভ্যাকানানো

17

আমি আমার ডকস্পিল এবং ডকার-কমপোজ.আইএমএলকে একটি সাবফোল্ডারে স্থানান্তরিত করে এটি ঠিক করেছি এবং এটি দুর্দান্ত কাজ করেছে। স্পষ্টতই ডকার বর্তমান ফোল্ডারটি ডেমনকে প্রেরণ করে এবং আমার ফোল্ডারটি ছিল 9 টি জিগ।


4
এই পদ্ধতিটি নিষিদ্ধ পথ দেয়: বিল্ড কনটেক্সট ত্রুটির বাইরে যদি কোনও পিতামাতার ডিরেক্টরি থেকে কোনও ফাইল অনুলিপি করা হয় তবে এর জন্য কোনও সমাধান?
কিটওয়ার্ড

8

আপনার কাছে যদি কোনও .dockerignoreফাইল থাকে এবং বিল্ড প্রসঙ্গে এখনও বড় হয়, আপনি সিলভার অনুসন্ধানকারী ব্যবহার করে ডকার বিল্ড প্রসঙ্গে কী পাঠানো হচ্ছে তা পরীক্ষা করতে পারেন :

ag --path-to-ignore .dockerignore --files-with-matches

লক্ষ্য করুন যে কিছু **নিদর্শনগুলি সঠিকভাবে কাজ করতে পারে না।

অতিরিক্ত মন্তব্যগুলির জন্য এই গিথুব ইস্যুটি দেখুন: https://github.com/moby/moby/issues/16056


4

আমার ক্ষেত্রে এটি ছিল যখন আমি ভুল -fযুক্তি দিয়ে সম্পাদন করি - ডকফেরিল যেখানে অবস্থিত সেই ডিরেক্টরিতে পাথ ছাড়াই

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/ - ঠিক আছে

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile - ভুল


1

আপনি যদি আপনার বিল্ড প্রসঙ্গে সম্পূর্ণ নিয়ন্ত্রণে থাকতে চান COPYতবে পরবর্তীকালে কোনও প্রসঙ্গ এবং প্রাসঙ্গিক ডেটা ছাড়াই আপনি ধারকটি সম্পূর্ণরূপে তৈরি করতে পারেন ।

docker build - < Dockerfile

এর একটি নেতিবাচক ADDদিকটি হ'ল এই পদ্ধতির সাহায্যে আপনি কেবলমাত্র ডকফায়াইলের মধ্যে একটি দূরবর্তী URL টি উল্লেখ করতে পারেন, এবং আপনার স্থানীয় হোস্টের ফাইলগুলি নয়।

Https://docs.docker.com/engine/references/commandline/build/#build-with-- দেখুন


0

আমার কাছে ফ্রিস্টাইলারের মতো একই সমস্যা ছিল। তবে আমি আমার প্রসঙ্গ থেকে এক ডিরেক্টরি থেকে তৈরি করছিলাম। সুতরাং -f টি যুক্তি সঠিক ছিল প্রসঙ্গটি ভুল ছিল।

project 
|
-------docker-dir 

নিম্নলিখিত ডকার-দির থেকে বিল্ডিং ভাল ছিল

docker build -t br_base:0.1 . 

ডক-দির থেকে বিল্ডিংয়ের প্রেক্ষাপট পরিবর্তিত হয়েছে। সুতরাং কমান্ডে আমার প্রসঙ্গটি পরিবর্তন করা দরকার। প্রসঙ্গটি '' দ্বারা দেওয়া হয়। উপরের আদেশে।

প্রকল্প ডিরেক্টরি থেকে নতুন কমান্ডটি হওয়া উচিত

docker build -t br_base:0.1 ./base

এখানে প্রসঙ্গটি './base' দ্বারা দেওয়া হয়েছে


0

যদি আপনি চিত্র তৈরি করছেন এবং বার্তাটি ডকার ডিমনকে বিল্ড কনটেক্সট প্রেরণ করছেন যা অনুলিপি করতে লগ সময় নিচ্ছে,

তারপরে .dockerignore ফাইল যুক্ত করুন । এটিতে ফাইল বা ডিরেক্টরি অন্তর্ভুক্ত করা উচিত যা অনুলিপি করার প্রয়োজন নেই।


0

জন্য NodeJS Application, .dockerignoreআপনার মূল প্রকল্প ডিরেক্টরিটি একটি .dockerignoreফাইল যুক্ত করুন এবং ফাইলের অভ্যন্তরে নিম্নলিখিতটি যুক্ত করুন

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