একটি ডকফাইফিলে রুন এবং সিএমডির মধ্যে পার্থক্য


291

আমি কখন CMDবনাম ব্যবহার করব সে সম্পর্কে আমি বিভ্রান্ত RUN। উদাহরণস্বরূপ, ব্যাশ / শেল কমান্ডগুলি কার্যকর করতে (অর্থাত্ ls -la) আমি সর্বদা ব্যবহার করব CMDবা এমন কোনও পরিস্থিতি আছে যা আমি ব্যবহার করব RUN? এই দুটি অনুরূপ Dockerfileদিকনির্দেশনা সম্পর্কে সেরা অনুশীলনগুলি বোঝার চেষ্টা করা ।


উত্তর:


423

রুন একটি চিত্র তৈরির পদক্ষেপ, একটি RUNকমান্ডের পরে ধারকটির অবস্থা ধারক ইমেজ প্রতিশ্রুতিবদ্ধ হবে। ইমেজটি তৈরি করতে একটি ডকফাইফিলের অনেকগুলি RUNপদক্ষেপ থাকতে পারে যা একে অপরের উপরে থাকে।

সিএমডি হ'ল কমান্ডারটি কমান্ডারটি ডিফল্টরূপে নির্ধারিত কমান্ড হয় যখন আপনি নির্মিত চিত্রটি চালু করেন। একটি ডকফেরফাইল কেবলমাত্র চূড়ান্ত CMDসংজ্ঞায়িত ব্যবহার করবে । CMDযখন সঙ্গে একটি ধারক শুরু ওভাররাইড করা যেতে পারে docker run $image $other_command

ENTRYPOINT এছাড়াও নিবিড়ভাবে সম্পর্কিত CMDএবং একটি ধারক একটি চিত্র শুরু করার উপায় পরিবর্তন করতে পারে।


15
আপনি RUNআপনার পরিবেশ সেটআপ করার জন্য প্রয়োজনীয় সমস্ত কিছু করেন এবং আপনার (কেবলমাত্র) সিএমডি আপনার ধারকটিতে চলমান প্রক্রিয়াটি শুরু করে, উদাহরণস্বরূপ, এনজিন্সের জন্য, গিথুব.com/nginxinc/docker- nginx/ blob/ … থেকে আপনি লাইনটি দেখতে পাবেনCMD ["nginx", "-g", "daemon off;"]
ব্যবহারকারী 2915097

"একটি ডকফেরফিলের কেবল একটি সিএমডি থাকতে পারে" - প্রযুক্তিগতভাবে সত্য নয়, তবে কার্যকরভাবে একটি ছাড়া সমস্ত এড়ানো হবে। জিঞ্জার বিয়ারের উত্তরটি দেখুন।
কলম্ব ভান্ডাল

"একটি ডকফাইফাইল কেবল চূড়ান্ত সিএমডি সংজ্ঞায়িত ব্যবহার করবে"? আসলে, চূড়ান্ত সিএমডি সংজ্ঞায়িত কনটেইনার হিসাবে চিত্র চালু করতে ব্যবহৃত হবে, তাই না?
পল চেউং

1
হ্যাঁ @ পলচিউং ডকফাইলে চূড়ান্ত কমান্ডটি চিত্রটিতে লেখা হয় এবং আপনি নির্মিত চিত্রটি চালু করার সময় কন্টেইনারটি ডিফল্টরূপে চালিত আদেশ হয়।
ম্যাট

126

RUN - আমরা ডকার চিত্রটি তৈরি করার সময় কমান্ড ট্রিগার করে।

CMD - আমরা তৈরি ডকার চিত্রটি চালু করার সময় কমান্ড ট্রিগার করে।


67

আমি এই নিবন্ধটি তাদের মধ্যে পার্থক্য বুঝতে খুব সহায়ক পেয়েছি :

রুন - রুন নির্দেশ আপনাকে এর জন্য প্রয়োজনীয় আপনার অ্যাপ্লিকেশন এবং প্যাকেজ ইনস্টল করতে দেয়। এটি বর্তমান চিত্রের উপরে যে কোনও কমান্ড কার্যকর করে এবং ফলাফল প্রতিশ্রুতি দিয়ে একটি নতুন স্তর তৈরি করে। প্রায়শই আপনি ডকফাইফিলে একাধিক RUN নির্দেশিকা খুঁজে পাবেন।

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


13

চালান - পাইথন ইনস্টল করুন, আপনার ধারক এখন পাইথন তার ইমেজ মধ্যে জ্বালিয়ে দিয়েছে
সিএমডি - পাইথন hello.py, আপনার প্রিয় স্ক্রিপ্টটি রান


সিএমডি - পাইথন ইনস্টল করুন, আমার পাত্রে এখন অজগরটি এর ইমেজে জ্বলে না?
কার্লোস ফন্টেস


8

রুন কমান্ড: রুন কমান্ডটি মূলত, যখন আমরা ইমেজটি তৈরি করব তখন ডিফল্ট কমান্ডটি কার্যকর করবে। এটি পরবর্তী পদক্ষেপের জন্য চিত্রের পরিবর্তনগুলিও প্রতিশ্রুতিবদ্ধ।

নতুন চিত্র তৈরির প্রক্রিয়ায় সহায়তা করার জন্য 1 টিরও বেশি রুন কমান্ড থাকতে পারে।

সিএমডি কমান্ড: সিএমডি কমান্ডগুলি নতুন ধারকটির জন্য কেবলমাত্র ডিফল্ট কমান্ড সেট করবে। এটি নির্মাণের সময় কার্যকর করা হবে না।

যদি কোনও ডকার ফাইলে 1 টিরও বেশি সিএমডি কমান্ড থাকে তবে সর্বশেষটি ব্যতীত সেগুলি সমস্ত উপেক্ষা করা হবে। যেহেতু এই কমান্ডটি কিছুই কার্যকর করবে না কেবলমাত্র ডিফল্ট কমান্ডটি সেট করবে।


6

দ্রষ্টব্য: আরএনআর কে সিএমডির সাথে বিভ্রান্ত করবেন না। RUN আসলে একটি কমান্ড চালায় এবং ফলাফলটি প্রতিশ্রুতি দেয়; সিএমডি বিল্ড সময় কোনও কিছুই কার্যকর করে না, তবে চিত্রটির জন্য উদ্দেশ্যে আদেশটি নির্দিষ্ট করে।

ডকার ফাইল রেফারেন্স থেকে

https://docs.docker.com/engine/reference/builder/#cmd


4

রুন : অনেকগুলি হতে পারে এবং এটি বিল্ড প্রক্রিয়াতে ব্যবহৃত হয় , উদাহরণস্বরূপ একাধিক লাইব্রেরি ইনস্টল করুন

সিএমডি : কেবলমাত্র 1 থাকতে পারে যা আপনার এক্সিকিউটিভ শুরুর পয়েন্ট (যেমন ["npm", "start"], ["node", "app.js"])


2

বিদ্যমান উত্তরগুলির মধ্যে যে কেউ এই প্রশ্নের দিকে নজর রাখবে তার বেশিরভাগ অংশ আবরণ। সুতরাং আমি কেবল সিএমডি এবং আর ইউএন এর জন্য কিছু কুলুঙ্গি অঞ্চলগুলি কভার করব।

সিএমডি: নকলগুলি অনুমোদিত তবে অপচয়যোগ্য

জিঞ্জার বিয়ার একটি গুরুত্বপূর্ণ বিষয় তুলে ধরে: আপনি একাধিক সিএমডি রাখলে কোনও ত্রুটি পাবেন না - তবে এটি করা ব্যর্থ waste আমি একটি উদাহরণ দিয়ে বিস্তারিত বলতে চাই:

FROM busybox
CMD echo "Executing CMD"
CMD echo "Executing CMD 2"

যদি আপনি এটিকে একটি চিত্র হিসাবে তৈরি করেন এবং এই চিত্রটিতে একটি ধারক চালান, তবে আদা বিয়ার যেমনটি বলেছে, কেবল শেষ সিএমডিই মনোযোগ দেওয়া হবে। সুতরাং সেই ধারকটির আউটপুট হবে:

সিএমডি কার্যকর করছেন 2

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

রুন: চিত্রগুলি ক্যাশে করা থাকলে কমান্ডগুলি কার্যকর করতে পারে না

রুন সম্পর্কে লক্ষ্য করার একটি সূক্ষ্ম বিষয় হ'ল পার্শ্ব-প্রতিক্রিয়া থাকলেও এটি খাঁটি ফাংশন হিসাবে বিবেচিত হয় এবং এভাবে ক্যাশে থাকে is এর অর্থ হ'ল যদি আরএনএনের কিছু পার্শ্ব প্রতিক্রিয়া থাকে যা ফলাফল চিত্রটি পরিবর্তন করে না এবং চিত্রটি ইতিমধ্যে ক্যাশে করা হয়েছে, তবে আরআনকে আবার কার্যকর করা হবে না এবং তাই পার্শ্ব প্রতিক্রিয়াগুলি পরবর্তী বিল্ডগুলিতে ঘটবে না। উদাহরণস্বরূপ, এই ডকফেরাইলটি নিন:

FROM busybox
RUN echo "Just echo while you work"

প্রথমবার এটি চালানোর পরে, আপনি বিভিন্ন বর্ণানুক্রমিক আইডি সহ এই জাতীয় আউটপুট পাবেন:

docker build -t example/run-echo .
Sending build context to Docker daemon  9.216kB
Step 1/2 : FROM busybox
 ---> be5888e67be6
Step 2/2 : RUN echo "Just echo while you work"
 ---> Running in ed37d558c505
Just echo while you work
Removing intermediate container ed37d558c505
 ---> 6f46f7a393d8
Successfully built 6f46f7a393d8
Successfully tagged example/run-echo:latest

লক্ষ্য করুন উপরোক্তভাবে প্রতিধ্বনি সম্পাদিত হয়েছিল। দ্বিতীয়বার যখন আপনি এটি চালান, এটি ক্যাশে ব্যবহার করে এবং আপনি বিল্ডের আউটপুটে কোনও প্রতিধ্বনি দেখতে পাবেন না:

docker build -t example/run-echo .
Sending build context to Docker daemon  9.216kB
Step 1/2 : FROM busybox
 ---> be5888e67be6
Step 2/2 : RUN echo "Just echo while you work"
 ---> Using cache
 ---> 6f46f7a393d8
Successfully built 6f46f7a393d8
Successfully tagged example/run-echo:latest

1

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

এই নিবন্ধটি তথ্যের একটি ভাল উত্স।

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