যখন সম্ভব হয়, আমি সর্বদা কমান্ডগুলিকে একত্রে মার্জ করি যা কমান্ডগুলির সাহায্যে ফাইল তৈরি করে যা একই ফাইলগুলিকে একক RUN
লাইনে মুছে দেয় । এটি কারণ প্রতিটি RUN
লাইন চিত্রটিতে একটি স্তর যুক্ত করে, আউটপুটটি আক্ষরিক অর্থে ফাইল সিস্টেম পরিবর্তন হয় যা আপনি দেখতে পেতেনdocker diff
এটি তৈরি করেছিলেন অস্থায়ী ধারকটিতেআপনি যদি অন্য কোনও স্তরটিতে তৈরি হওয়া কোনও ফাইল মুছে ফেলেন তবে সমস্ত ইউনিয়ন ফাইল সিস্টেম একটি নতুন স্তরের ফাইল-সিস্টেম পরিবর্তনকে নিবন্ধিত করবে, ফাইলটি পূর্ববর্তী স্তরে এখনও বিদ্যমান রয়েছে এবং এটি নেটওয়ার্কওয়াকে চালিত হয়ে ডিস্কে সঞ্চিত হয়। সুতরাং আপনি যদি সোর্স কোডটি ডাউনলোড করেন, এটি এক্সট্রাক্ট করুন, এটি একটি বাইনারি মধ্যে সংকলন করুন এবং তারপরে tgz এবং উত্স ফাইলগুলি মুছুন, আপনি চিত্রটির আকার হ্রাস করার জন্য সত্যই এটি একটি লেয়ারে সম্পন্ন করতে চান।
এরপরে, আমি অন্যান্য চিত্রগুলিতে পুনরায় ব্যবহারের সম্ভাবনা এবং প্রত্যাশিত ক্যাশে ব্যবহারের ভিত্তিতে ব্যক্তিগতভাবে স্তরগুলি বিভক্ত করি। যদি আমার কাছে 4 টি চিত্র থাকে তবে সমস্ত একই বেস ইমেজ (যেমন ডেবিয়ান) সহ, আমি সেই চিত্রগুলির বেশিরভাগের কাছে সাধারণ ইউটিলিটিগুলির একটি সংগ্রহ প্রথম রান কমান্ডের মধ্যে টানতে পারি যাতে অন্যান্য চিত্রগুলি ক্যাশে হওয়া থেকে উপকৃত হয়।
চিত্রের ক্যাশে পুনরায় ব্যবহারের দিকে তাকানোর সময় ডকফাইলে অর্ডার দেওয়া গুরুত্বপূর্ণ। আমি এমন কোনও উপাদান দেখি যা খুব কমই আপডেট হবে, সম্ভবত তখনই যখন বেস ইমেজ আপডেট হয় এবং সেগুলি ডকফাইফিলের উপরে রাখে। ডকফাইফাইলের শেষের দিকে, আমি এমন কোনও কমান্ড অন্তর্ভুক্ত করেছি যা দ্রুত চলবে এবং ঘন ঘন পরিবর্তিত হতে পারে, যেমন একটি হোস্ট নির্দিষ্ট ইউআইডি সহ কোনও ব্যবহারকারী যুক্ত করা বা ফোল্ডার তৈরি করা এবং অনুমতি পরিবর্তন করা। যদি ধারকটিতে সক্রিয়ভাবে বিকশিত হওয়া ব্যাখ্যা করা কোড (যেমন জাভাস্ক্রিপ্ট) অন্তর্ভুক্ত থাকে তবে এটি যতটা সম্ভব দেরীতে যুক্ত হয়ে যায় যাতে পুনর্নির্মাণ কেবল সেই একক পরিবর্তন চালায়।
এই প্রতিটি পরিবর্তনের গোষ্ঠীতে আমি স্তরগুলি হ্রাস করার জন্য যথাসম্ভব সর্বোত্তমভাবে একীকরণ করি। সুতরাং যদি সেখানে 4 টি ভিন্ন উত্স কোড ফোল্ডার থাকে তবে সেগুলি একটি একক ফোল্ডারে রাখা হয় যাতে এটি একটি একক কমান্ডের সাহায্যে যুক্ত করা যায়। প্যাকেজ ম্যানেজারের ওভারহেডের পরিমাণ হ্রাস করতে (আপডেট করা এবং পরিষ্কার করা) সম্ভব হলে অ্যাপট-গেটের মতো কিছু থেকে যে কোনও প্যাকেজ ইনস্টল করা একটি একক আরআনগুলিতে মিশে যায়।
মাল্টি-স্টেজ বিল্ডগুলির জন্য আপডেট:
মাল্টি-স্টেজ বিল্ডের চূড়ান্ত পর্যায়ে চিত্রের আকার হ্রাস করার বিষয়ে আমি খুব কম উদ্বেগ প্রকাশ করি। যখন এই পর্যায়গুলি ট্যাগ করা হয় না এবং অন্য নোডে প্রেরণ করা হয় না, আপনি প্রতিটি কমান্ডকে আলাদা RUN
লাইনে ভাগ করে ক্যাশে পুনরায় ব্যবহারের সম্ভাবনা সর্বাধিক করে তুলতে পারেন ।
যাইহোক, স্তরগুলি স্কোয়াশ করার কোনও সঠিক সমাধান নয় কারণ আপনি পর্যায়গুলির মধ্যে অনুলিপি করা সমস্তগুলি ফাইল এবং পরিবেশের পরিবর্তনশীল সেটিংস, এন্ট্রিপয়েন্ট এবং কমান্ডের মতো চিত্রের মেটা-ডেটা নয়। এবং আপনি যখন কোনও লিনাক্স বিতরণে প্যাকেজ ইনস্টল করেন, সমস্ত নির্ভরতার অনুলিপি তৈরি করে লাইব্রেরি এবং অন্যান্য নির্ভরতা ফাইল সিস্টেমের মধ্যে ছড়িয়ে দেওয়া হতে পারে।
এ কারণে, আমি সিআই / সিডি সার্ভারে বাইনারিগুলি তৈরির প্রতিস্থাপন হিসাবে মাল্টি-স্টেজ বিল্ডগুলি ব্যবহার করি, যাতে আমার সিআই / সিডি সার্ভারে কেবল চালনার জন্য docker build
সরঞ্জামিং থাকা দরকার, এবং জেডিকে, নোডেজগুলি না যায়, এবং অন্য কোনও সংকলন সরঞ্জাম ইনস্টল করা আছে।