ডকার স্তরগুলি বোঝা


27

আমাদের নিম্নলিখিত ব্লক আছে Dockerfile:

RUN yum -y update
RUN yum -y install epel-release
RUN yum -y groupinstall "Development Tools"
RUN yum -y install python-pip git mysql-devel libxml2-devel libxslt-devel python-devel openldap-devel libffi-devel openssl-devel

আমাকে বলা হয়েছে যে RUNতৈরি ডকার স্তরগুলি কাটাতে আমাদের এই আদেশগুলি একত্রিত করা উচিত :

RUN yum -y update \
    && yum -y install epel-release \
    && yum -y groupinstall "Development Tools" \
    && yum -y install python-pip git mysql-devel libxml2-devel libxslt-devel python-devel openldap-devel libffi-devel openssl-devel

আমি ডকারে খুব নতুন এবং নিশ্চিত নই যে আমি একাধিক RUN কমান্ড উল্লেখ করার এই দুটি সংস্করণের মধ্যে পার্থক্যটি পুরোপুরি বুঝতে পেরেছি। কবে RUNএকটি একক কমান্ড একীভূত হবে এবং যখন এটি একাধিক RUNআদেশ আছে বোঝা ?


উত্তর:


35

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

কোনও ছবিতে ব্যবহৃত স্তরগুলির সংখ্যা গুরুত্বপূর্ণ

  • চিত্রগুলিকে ধাক্কা দেওয়া বা টানানোর সময় এটি সমবর্তী আপলোড বা ডাউনলোডের সংখ্যাকে প্রভাবিত করে।
  • একটি ধারক শুরু করার সময়, স্তরগুলি একত্রিত হয়ে পাত্রে ব্যবহৃত ফাইল সিস্টেম উত্পাদন করতে; যত বেশি স্তর জড়িত থাকে তত কার্যকারিতা খারাপ হয়, তবে বিভিন্ন ফাইল সিস্টেম ব্যাকেন্ডগুলি এর দ্বারা আলাদাভাবে প্রভাবিত হয়।

চিত্রগুলি কীভাবে তৈরি করা উচিত তার এর বেশ কয়েকটি পরিণতি রয়েছে। আমি যে প্রথম এবং সবচেয়ে গুরুত্বপূর্ণ পরামর্শ দিতে পারি তা হ'ল:

পরামর্শ # 1 নিশ্চিত করুন যে আপনার উত্স কোডটি জড়িত রয়েছে সেই বিল্ড স্টেপগুলি ডকস্পাইলে যতদূর সম্ভব দেরি হয়ে আসে এবং কোনও &&বা একটি ব্যবহার করে পূর্ববর্তী কমান্ডগুলির সাথে আবদ্ধ না হয় ;

এর কারণ, পূর্ববর্তী সমস্ত পদক্ষেপগুলি ক্যাশে করা হবে এবং সংশ্লিষ্ট স্তরগুলি বার বার ডাউনলোড করার প্রয়োজন হবে না। এর অর্থ দ্রুত বিল্ডস এবং দ্রুত রিলিজ, যা সম্ভবত আপনি চান। আকর্ষণীয়ভাবে যথেষ্ট, ডকার ক্যাশে অনুকূল ব্যবহার করা আশ্চর্যজনকভাবে শক্ত।

আমার দ্বিতীয় পরামর্শটি কম গুরুত্বপূর্ণ তবে এটি রক্ষণাবেক্ষণের দৃষ্টিভঙ্গি থেকে খুব দরকারী বলে মনে করি:

পরামর্শ # 2 ডকফাইলে জটিল কমান্ডগুলি লিখবেন না বরং অনুলিপি এবং কার্যকর করতে হবে এমন স্ক্রিপ্টগুলি ব্যবহার করুন।

এই পরামর্শ অনুসরণ করে একজন ডকফায়াইল দেখতে পাবেন

COPY apt_setup.sh /root/
RUN sh -x /root/apt_setup.sh
COPY install_pacakges.sh /root/
RUN sh -x /root/install_packages.sh

ইত্যাদি। একাধিক কমান্ডের সাথে বাধ্যবাধকতার পরামর্শের &&সীমিত সুযোগ রয়েছে। স্ক্রিপ্টগুলি দিয়ে লেখা অনেক সহজ, যেখানে আপনি অতিরিক্ত কাজ এড়াতে বা ডকুমেন্টেশনের প্রয়োজনে ফাংশন ইত্যাদি ব্যবহার করতে পারেন।

প্রাক প্রসেসর দ্বারা আগ্রহী এবং COPYপদক্ষেপগুলির কারণে সৃষ্ট ছোট ওভারহেড এড়াতে ইচ্ছুক এবং প্রকৃতপক্ষে ফ্লাইটে ডকফাইফিল তৈরি করছে যেখানে

COPY apt_setup.sh /root/
RUN sh -x /root/apt_setup.sh

ক্রম দ্বারা প্রতিস্থাপিত হয়

RUN base64 --decode … | sh -x

যেখানে বেস 64-এনকোডড সংস্করণ apt_setup.sh

আমার তৃতীয় পরামর্শটি সেই লোকদের জন্য যারা দীর্ঘ বিল্ডের সম্ভাব্য ব্যয়ে আকার এবং স্তরগুলির সীমাবদ্ধ করতে চান।

পরামর্শ # 3with মধ্যবর্তী স্তরগুলিতে উপস্থিত ফাইলগুলি এড়ানোর জন্য ফলাফল-সিস্টেমটি নয় তবে -আইডিম ব্যবহার করুন ।

কিছু ডকার নির্দেশ দ্বারা যুক্ত এবং পরবর্তী নির্দেশাবলীর দ্বারা মুছে ফেলা ফলস্বরূপ ফাইলসিস্টেমটিতে উপস্থিত নেই তবে এটি ডকর স্তরগুলিতে দু'বার উল্লেখ করা হয়েছে যা নির্মাণে ডকার ইমেজ গঠন করে। একবার, নির্দেশে যুক্ত হওয়ার পরে স্তরটিতে নাম এবং পূর্ণ সামগ্রী সহ এবং এটি একবার সরানোর নির্দেশের ফলে স্তরটিতে মুছে ফেলার নোটিশ হিসাবে।

উদাহরণস্বরূপ, ধরুন আমাদের অস্থায়ীভাবে একটি সি সংকলক এবং কিছু চিত্র প্রয়োজন এবং এটি বিবেচনা করুন

# !!! THIS DISPLAYS SOME PROBLEM --- DO NOT USE !!!
RUN apt-get install -y gcc
RUN gcc --version
RUN apt-get --purge autoremove -y gcc

(আরও বাস্তব উদাহরণ উদাহরণস্বরূপ --versionপতাকাটির সাথে উপস্থিতি প্রমাণ করার পরিবর্তে সংকলকটির সাথে কিছু সফ্টওয়্যার তৈরি করবে ))

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

with-Idiom বিছিন্ন রিসোর্স মালিকানা ও রিসোর্স এটি ব্যবহার যুক্তিবিজ্ঞান থেকে মুক্তি করার জন্য কার্যকরী প্রোগ্রামিং একটি সাধারণ ফর্ম। এই আইডিয়োমটি শেল-স্ক্রিপ্টিংয়ে স্থানান্তর করা সহজ, এবং আমরা পরামর্শ # 2 এরCOPY & RUN মতো ব্যবহার করতে পূর্ববর্তী কমান্ডগুলি নিম্নলিখিত স্ক্রিপ্ট হিসাবে পুনরায় লিখতে পারি

# with_c_compiler SIMPLE-COMMAND
#  Execute SIMPLE-COMMAND in a sub-shell with gcc being available.

with_c_compiler()
(
    set -e
    apt-get install -y gcc
    "$@"
    trap 'apt-get --purge autoremove -y gcc' EXIT
)

with_c_compiler\
    gcc --version

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

আমরা যদি পরামর্শ # 2 উপেক্ষা করতে চাই তবে ফলস্বরূপ ডকফেরফিল স্নিপেটটি হবে

RUN apt-get install -y gcc\
 && gcc --version\
 && apt-get --purge autoremove -y gcc

যা পড়া এবং বজায় রাখা এতটা সহজ নয় কারণ অচলতার কারণে। শেল-স্ক্রিপ্ট রূপটি কীভাবে গুরুত্বপূর্ণ অংশটির উপর জোর দেয়, gcc --versionশৃঙ্খলাবদ্ধভাবে &&এই অংশটি শোরগোলের মাঝখানে কবর দেয়।


1
কোনও স্ক্রিপ্ট ব্যবহার করে এবং এক RUN বিবৃতিতে একাধিক কমান্ড ব্যবহার করার পরে আপনি বক্স আকারের ফলাফলটি অন্তর্ভুক্ত করতে পারেন?
030

1
ইমেজ বেসের কনফিগারেশন (যেমন ওএস স্টাফ) এবং এমনকি আপনি যে উত্সটি লিখেছেন সেটির সেট আপের সাথেও লিবিং করা আমার কাছে খারাপ ধারণা বলে মনে হচ্ছে। আপনি বলছেন "আপনার উত্স কোডটি জড়িত রয়েছে এমন বিল্ড স্টেপগুলি যত তাড়াতাড়ি সম্ভব আসতে পারে" তা নিশ্চিত করুন। সেই অংশটিকে সম্পূর্ণ স্বতন্ত্র শৈল্পিক করে তোলার কোনও সমস্যা আছে কি?
জিমি জেমস

1
@ 030 "বক্স" আকারের সাথে আপনি কী বোঝাতে চাইছেন? আপনি কোন বাক্সটি উল্লেখ করছেন তা আমার কোনও ধারণা নেই।
মাইকেল লে বার্বিয়ার গ্রেনওয়াল্ড

1
আমি ডোকর ছবির আকার বলতে চাইছি
030

1
@ জিমি জেমস এটি আপনার স্থাপনার দৃশ্যের উপর নির্ভর করে depends যদি আমরা একটি সংকলিত প্রোগ্রামটি ধরে নিই, তবে "সঠিক কাজটি হ'ল" এটি প্যাকেজ করা এবং সেই প্যাকেজ নির্ভরতা এবং প্যাকেজটি নিজেই দুটি স্বতন্ত্র-চূড়ান্ত পদক্ষেপ হিসাবে ইনস্টল করা হবে। এটি ডকার ক্যাশের উপযোগিতা সর্বাধিক করে তোলার জন্য এবং একই ফাইলগুলির সাথে উপরের স্তরগুলি ডাউনলোড করা এড়াতে। চিত্রগুলির দীর্ঘ নির্ভরতা শৃঙ্খলা তৈরির চেয়ে ডকারের চিত্রগুলি তৈরির জন্য বিল্ড রেসিপিগুলি ভাগ করা আমার কাছে সহজ মনে হয়েছে, কারণ পরবর্তীগুলি পুনর্নির্মাণকে আরও শক্ত করে তোলে।
মাইকেল লে বার্বিয়ার গ্রেনওয়াল্ড

13

আপনি আপনার ডকফেরলে তৈরি প্রতিটি নির্দেশের ফলস্বরূপ একটি নতুন চিত্র স্তর তৈরি হবে। প্রতিটি স্তর অতিরিক্ত ডেটা নিয়ে আসে যা সর্বদা ফলাফলের চিত্রের অংশ নয়। উদাহরণস্বরূপ, আপনি যদি একটি লেয়ারে একটি ফাইল যুক্ত করেন তবে পরে এটি অন্য স্তরে সরিয়ে ফেলেন, চূড়ান্ত চিত্রের আকারে যুক্ত হওয়া ফাইলের আকারটি একটি বিশেষ "হোয়াইটআউট" ফাইলের আকারে অন্তর্ভুক্ত করা হবে যদিও আপনি এটি অপসারণ করেছেন।

ধরা যাক আপনার নিম্নলিখিত ডকফেরাইল রয়েছে:

FROM centos:6

RUN yum -y update 
RUN yum -y install epel-release

ফলস্বরূপ চিত্রের আকার হবে

bigimage     latest        3c5cbfbb4116        2 minutes ago    407MB

বিপরীতে, "অনুরূপ" ডকফেরফিলের সাথে:

FROM centos:6

RUN yum -y update  && yum -y install epel-release

ফলস্বরূপ চিত্রের আকার হবে

smallimage     latest        7edeafc01ffe        3 minutes ago    384MB

আপনি যদি কোনও একক আরএন স্টেটমেন্টে ইয়াম ক্যাশে পরিষ্কার করেন তবে আপনি আরও ছোট আকারের পাবেন।

সুতরাং আপনি পঠনযোগ্যতা / রক্ষণাবেক্ষণের সহজতা এবং স্তরগুলির সংখ্যা / চিত্রের আকারের মধ্যে ভারসাম্য বজায় রাখতে চান।


4

RUNবিবৃতি প্রতিটি এক স্তর প্রতিনিধিত্ব করে। কল্পনা করুন যে কেউ একটি প্যাকেজ ডাউনলোড করে, এটি ইনস্টল করে এবং এটি মুছে ফেলতে চাই। যদি কেউ তিনটি RUNবিবৃতি ব্যবহার করে তবে পৃথক স্তর থাকায় চিত্রের আকার সঙ্কুচিত হবে না। যদি কেউ একটি RUNবিবৃতি ব্যবহার করে সমস্ত কমান্ড চালায় তবে ডিস্ক চিত্রের আকার হ্রাস করা যেতে পারে।

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