ডকফাইফিলের সিএমডি এবং ENTRYPOINT এর মধ্যে পার্থক্য কী?


1695

ডকফিলিলেসে দুটি কমান্ড রয়েছে যা আমার অনুরূপ: CMDএবং ENTRYPOINT। তবে আমি অনুমান করি যে তাদের মধ্যে একটি (সূক্ষ্ম?) পার্থক্য রয়েছে - অন্যথায় এটি একই জিনিসটির জন্য দুটি কমান্ড থাকার কোনও মানে হয় না।

ডকুমেন্টেশন জন্য বিবরণ CMD

সিএমডির মূল উদ্দেশ্য একটি নির্বাহী ধারকটির জন্য খেলাপি সরবরাহ করা।

এবং এর জন্য ENTRYPOINT:

একটি ENTRYPOINT আপনাকে এমন একটি ধারক কনফিগার করতে সহায়তা করে যা আপনি এক্সিকিউটেবল হিসাবে চালাতে পারেন।

সুতরাং, এই দুটি কমান্ডের মধ্যে পার্থক্য কি?


12
এই ব্লগ পোস্টটিতে পার্থক্যগুলি এবং কীভাবে সেগুলিও একসাথে ব্যবহার করা যেতে পারে তার একটি ভাল বর্ণনা রয়েছে: ক্রসবিমিকেল / ডকফেরফাইল-বেস্ট- প্র্যাকটিসস html
slm

2
! যে! ধন্যবাদ @ এসএমএল। এখানে আরও একটি অনুরূপ রেফারেন্স যা কিছুটা আপ-টু-ডেট হতে পারে: ডকস.ডকার
অ্যাডাম


1
এই লিঙ্কটি আরএন, সিএমডি এবং ENTRYPOINT এর মধ্যে পার্থক্য সরবরাহ করে: goinbigdata.com/docker-run-vs-cmd-vs-entryPoint
প্রফি

শুধু লক্ষ্য করুন যে CMDএবং ENTRYPOINTউভয়ের লিখিত, নির্বাহশেল ফর্মের আলাদা আলাদা ফর্ম রয়েছে। সুতরাং নিজেকে অনুকূল করুন এবং ব্যবহারের ফর্মের উপর নির্ভর করে আচরণের সূক্ষ্ম পার্থক্যগুলি বুঝতে পারবেন। তারপরে docs.docker.com/engine/references/builder/… পড়ুন
জাইমে হাবলুটজেল

উত্তর:


1733

ডকারের একটি ডিফল্ট এন্ট্রিপয়েন্ট রয়েছে যা /bin/sh -c ডিফল্ট কমান্ড নেই।

আপনি যখন এভাবে ডকার চালান: docker run -i -t ubuntu bash এন্ট্রিপয়েন্টটি ডিফল্ট হয় /bin/sh -c, চিত্রটি হয় ubuntuএবং কমান্ডটি হয় bash

কমান্ডটি এন্ট্রিপয়েন্টের মাধ্যমে চালিত হয়। অর্থাৎ, বাস্তবায়িত হয়ে যায় যা হয় /bin/sh -c bash। এটি RUNশেকের পার্সারের উপর নির্ভর করে ডকারকে দ্রুত প্রয়োগ করতে দেয় ।

পরে, লোকেরা এটি কাস্টমাইজ করতে সক্ষম হতে বলেছিল, তাই ENTRYPOINTএবং--entrypoint তাদের সাথে পরিচয় করিয়ে দেওয়া হয়েছিল।

ubuntuউপরের উদাহরণের পরে সমস্ত কিছুই হ'ল আদেশ এবং এন্ট্রিপয়েন্টে পৌঁছে দেওয়া হয়েছে। CMDনির্দেশটি ব্যবহার করার সময় , আপনি ঠিক যেমনটি করছেন ঠিক তেমনই docker run -i -t ubuntu <cmd><cmd>এন্ট্রিপয়েন্টের প্যারামিটার হবে।

পরিবর্তে এই আদেশটি টাইপ করলে আপনিও একই ফলাফল পাবেন docker run -i -t ubuntu। আপনি এখনও ধারকটিতে একটি ব্যাশ শেল শুরু করবেন কারণ উবুন্টু ডকফাইফিল একটি ডিফল্ট সিএমডি নির্দিষ্ট করেছে:CMD ["bash"]

সমস্ত কিছু এন্ট্রিপয়েন্টে পৌঁছে যাওয়ার সাথে সাথে আপনার চিত্রগুলি থেকে আপনার খুব সুন্দর আচরণ হতে পারে। @ জিরি উদাহরণটি ভাল, এটি "বাইনারি" হিসাবে কোনও চিত্র কীভাবে ব্যবহার করবেন তা দেখায়। ["/bin/cat"]এন্ট্রিপয়েন্ট হিসাবে ব্যবহার করার পরে এবং করার পরে docker run img /etc/passwd, আপনি এটি পেয়েছেন, /etc/passwdআদেশটি এবং এন্ট্রিপয়েন্টে পাস করা হয় যাতে শেষ ফলাফল কার্যকর করা সহজ হয় /bin/cat /etc/passwd

অন্য উদাহরণ হ'ল এন্ট্রিপয়েন্ট হিসাবে কোনও ক্লিপ থাকা। উদাহরণস্বরূপ, যদি আপনি একটি redis চিত্র আছে, পরিবর্তে চলমান docker run redisimg redis -H something -u toto get key, আপনি কেবল থাকতে পারে ENTRYPOINT ["redis", "-H", "something", "-u", "toto"]এবং তারপর একই ফলাফলের জন্য ভালো সঞ্চালন করুন: docker run redisimg get key


3
একদমই না. ENTRYPOINT একটি মেটাডেটা সেট করে যা রানটাইমের সময় (তবে ওভাররাইড করা যেতে পারে), সুতরাং আপনি যদি কিছু পরিবর্তন না করেন, আপনার ধারক শুরু করার পরে, ফলাফলটি একই রকম হবে, তবে, বিল্ড টাইমে আরআনকে বহির্ভূত করা হবে এবং আপনি যা কিছু বলুন না কেন রানটাইম এ করুন, এটি এখানে হবে।
ক্র্যাক

8
ডিফল্টরূপে নেই ENTRYPOINT; কোনও শেল ব্যবহৃত হয়েছে কিনা তা CMDকমান্ডের ব্যবহৃত ফর্মের উপর নির্ভর করে ( ডকস.ডকার.ইনজিন / রেফারেন্স / বিল্ডার / # সেমিডি )।
ব্লেসরব্লেড

19
এর জন্য ধন্যবাদ, whatতিহাসিক প্রেক্ষাপট অনেকটা সহায়তা করে কারণ আমি কী ওভাররাইড করা এবং কী সংযোজন করা হয়েছে সে সম্পর্কে আপাতদৃষ্টিতে তীব্র নিয়মগুলি মনে করার জন্য লড়াই করে যাচ্ছিলাম technical কেবল তথ্য এবং পরিস্থিতিগুলি তালিকাভুক্ত করবেন না :-)
অ্যাশারলি

84
এটি একটি চমত্কার উত্তর। আমি মনে করি ডকার ডকুমেন্টেশনে এটি CMDবনাম নামে একটি বিভাগের অধীনে যুক্ত করা উচিত ENTRYPOINT
তারিক

5
@ ওয়েবেম্যান নং। তারা দুটি ভিন্ন নির্দেশনা। যদি তারা উভয়ই থাকে, সিএমডি ENTRYPOINT এর পরামিতি হিসাবে বিবেচিত হবে।
লাইট.জি

626

ENTRYPOINTনির্দিষ্ট করে কমান্ড যে সবসময় যখন ধারক শুরু মৃত্যুদন্ড কার্যকর করা হবে না।

CMDনির্দিষ্ট করে যুক্তি হল যে খাওয়ানো হবে ENTRYPOINT

আপনি যদি কোনও নির্দিষ্ট কমান্ডের জন্য নিবেদিত কোনও চিত্র তৈরি করতে চান তবে আপনি ব্যবহার করবেন ENTRYPOINT ["/path/dedicated_command"]

অন্যথায়, আপনি যদি সাধারণ উদ্দেশ্যে কোনও চিত্র তৈরি করতে চান তবে আপনি ENTRYPOINTঅনির্ধারিত রেখে দিতে পারেন এবং CMD ["/path/dedicated_command"]যুক্তি সরবরাহ করে সেটিংসকে ওভাররাইড করতে সক্ষম হবেন তাইdocker run

উদাহরণস্বরূপ, যদি আপনার ডকফেরফিলটি হয়:

FROM debian:wheezy
ENTRYPOINT ["/bin/ping"]
CMD ["localhost"]

কোনও যুক্তি ছাড়াই চিত্র চালানো লোকালহোস্টকে পিন করবে:

$ docker run -it test
PING localhost (127.0.0.1): 48 data bytes
56 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.096 ms
56 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.088 ms
56 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.088 ms
^C--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.088/0.091/0.096/0.000 ms

এখন, একটি আর্গুমেন্ট সহ চিত্রটি চালানো যুক্তিটি পিন করবে:

$ docker run -it test google.com
PING google.com (173.194.45.70): 48 data bytes
56 bytes from 173.194.45.70: icmp_seq=0 ttl=55 time=32.583 ms
56 bytes from 173.194.45.70: icmp_seq=2 ttl=55 time=30.327 ms
56 bytes from 173.194.45.70: icmp_seq=4 ttl=55 time=46.379 ms
^C--- google.com ping statistics ---
5 packets transmitted, 3 packets received, 40% packet loss
round-trip min/avg/max/stddev = 30.327/36.430/46.379/7.095 ms

তুলনার জন্য, যদি আপনার ডকফেরফিলটি হয়:

FROM debian:wheezy
CMD ["/bin/ping", "localhost"]

কোনও যুক্তি ছাড়াই চিত্র চালানো লোকালহোস্টকে পিন করবে:

$ docker run -it test
PING localhost (127.0.0.1): 48 data bytes
56 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.076 ms
56 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.087 ms
56 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.090 ms
^C--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.076/0.084/0.090/0.000 ms

তবে একটি যুক্তি দিয়ে চিত্রটি চালানো যুক্তিটি চালিয়ে যাবে:

docker run -it test bash
root@e8bb7249b843:/#

আরও তথ্যের জন্য ব্রায়ান ডিহ্যামারের এই নিবন্ধটি দেখুন: https://www.ctl.io/developers/blog/post/dockerfile-entryPoint-vs-cmd/


218
The ENTRYPOINT specifies a command that will always be executed when the container starts. The CMD specifies arguments that will be fed to the ENTRYPOINT.দ্য-পয়েন্ট-এর সংক্ষিপ্তসার।
জিংগুও ইয়াও

1
ENTRYPOINT এছাড়াও --entryPoint পতাকা ব্যবহার করে ওভাররাইড করা যেতে পারে। উদাহরণস্বরূপ ডকার রান-ইন্ট্রিয়েন্ট পয়েন্ট বাশ পরীক্ষার জন্য
সিমিমুরুগান

2
আমি আপনার উদাহরণগুলি পছন্দ করি, এটি সত্যই সহায়ক!
চৌ জিয়াং

2
@ জিংগুও ইয়াও: সিএমডি-সিএমডি ["এনগিনেক্স", "- জি", "ডেমন", "অফ"] এর মতো একটি কমান্ড থাকলে কী হবে? এটি শৃঙ্খলিত হবে?
কেএমসি

@ কেএমসি সিএমডি এটি ENTRYPOINT এর ডিফল্ট আর্গুমেন্ট, আপনি যখন চিত্রটি চালাচ্ছেন তখন একটি নতুন আরগ পাস করে ওভাররাইড করুন।
এমজিপি

237

ডকার ডক্স অনুসারে ,

সিএমডি এবং ENTRYPOINT উভয় নির্দেশাবলী কনটেইনারটি চালানোর সময় কোন আদেশটি কার্যকর করা হয় তা নির্ধারণ করে। কিছু নিয়ম রয়েছে যা তাদের সহযোগিতা বর্ণনা করে।

  1. ডকফাইফাইলের কমপক্ষে একটি CMDবা ENTRYPOINTআদেশ উল্লেখ করা উচিত should
  2. ENTRYPOINT একটি নির্বাহযোগ্য হিসাবে ধারক ব্যবহার করার সময় সংজ্ঞায়িত করা উচিত।
  3. CMDENTRYPOINTকমান্ডের জন্য বা ধারকটিতে একটি অ্যাড-হক কমান্ড কার্যকর করার জন্য ডিফল্ট আর্গুমেন্টগুলি সংজ্ঞায়নের উপায় হিসাবে ব্যবহার করা উচিত ।
  4. CMD বিকল্প যুক্তি সহ ধারক চালানোর সময় ওভাররাইড করা হবে।

নীচের টেবিলগুলি দেখায় বিভিন্ন ENTRYPOINT/ CMDসংমিশ্রণের জন্য কোন আদেশটি কার্যকর করা হবে তা :

- No ENTRYPOINT

╔════════════════════════════╦═════════════════════════════╗
║ No CMD                     ║ error, not allowed          ║
╟────────────────────────────╫─────────────────────────────╢
║ CMD [“exec_cmd”, “p1_cmd”] ║ exec_cmd p1_cmd             ║
╟────────────────────────────╫─────────────────────────────╢
║ CMD [“p1_cmd”, “p2_cmd”]   ║ p1_cmd p2_cmd               ║
╟────────────────────────────╫─────────────────────────────╢
║ CMD exec_cmd p1_cmd        ║ /bin/sh -c exec_cmd p1_cmd  ║
╚════════════════════════════╩═════════════════════════════╝

- ENTRYPOINT exec_entry p1_entry

╔════════════════════════════╦══════════════════════════════════╗
║ No CMD                     ║ /bin/sh -c exec_entry p1_entry   ║
╟────────────────────────────╫──────────────────────────────────╢
║ CMD [“exec_cmd”, “p1_cmd”] ║ /bin/sh -c exec_entry p1_entry   ║
╟────────────────────────────╫──────────────────────────────────╢
║ CMD [“p1_cmd”, “p2_cmd”]   ║ /bin/sh -c exec_entry p1_entry   ║
╟────────────────────────────╫──────────────────────────────────╢
║ CMD exec_cmd p1_cmd        ║ /bin/sh -c exec_entry p1_entry   ║
╚════════════════════════════╩══════════════════════════════════╝

- ENTRYPOINT [“exec_entry”, “p1_entry”]

╔════════════════════════════╦═════════════════════════════════════════════════╗
║ No CMD                     ║ exec_entry p1_entry                             ║
╟────────────────────────────╫─────────────────────────────────────────────────╢
║ CMD [“exec_cmd”, “p1_cmd”] ║ exec_entry p1_entry exec_cmd p1_cmd             ║
╟────────────────────────────╫─────────────────────────────────────────────────╢
║ CMD [“p1_cmd”, “p2_cmd”]   ║ exec_entry p1_entry p1_cmd p2_cmd               ║
╟────────────────────────────╫─────────────────────────────────────────────────╢
║ CMD exec_cmd p1_cmd        ║ exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd  ║
╚════════════════════════════╩═════════════════════════════════════════════════╝

পিএক্স_সিএমডি এবং এক্সিকিউট_এন্ট্রি কী? তারা যখন একই নির্বাহের লাইনে থাকে তখন কী বোঝায়? তারা একে অপরের যুক্তি হিসাবে পাস হয়? এমনকি /bin/sh -cজড়িত থাকলেও ?
ড্যানিয়েলো 515

1
@ ড্যানিয়েলো 515 'px_cmd' এবং 'exec_entry' উভয়ই এখানে কেবল ডামি স্ট্রিং। আপনি কেবল লক্ষ্য করতে পারেন যে /bin/sh -cসিএমডি এক্সিকিউটেবল সিনট্যাক্সে লিখিত হয়েছে (সিনট্যাক্সের তালিকা নয়) সিএমডি উপসর্গ হিসাবে যুক্ত হবে।
লাইট.জি

1
@ রইকি যদি ব্যবহারকারী ডকার রানের জন্য যুক্তিগুলি নির্দিষ্ট করে তবে তারা সিএমডি-তে নির্দিষ্ট ডিফল্টটিকে ওভাররাইড করবে।
দোনরডাডন

2
ENTRYPOINT exec_entry p1_entভুলভাবে ব্যাখ্যা করা হয়েছিল। শেল ফর্মটি যে কোনও সিএমডি বা রান কমান্ড লাইন আর্গুমেন্টগুলি ব্যবহার হতে বাধা দেয় - ডকস.ডোকার.com
মারিউজ মিয়াসিয়াক

1
@ মারিউসমিজিয়াক এটি এখন আপডেট হয়েছে। আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ।
রাফাফ তাহসিন

169

হ্যাঁ, এটি একটি ভাল প্রশ্ন। আমি এখনও এটি পুরোপুরি বুঝতে পারি না, তবে:

আমি বুঝতে পারি যে ENTRYPOINTবাইনারিটি কার্যকর করা হচ্ছে। আপনি --entryPoint = "" দ্বারা এন্ট্রিপয়েন্টটি উপেক্ষা করতে পারেন।

docker run -t -i --entrypoint="/bin/bash" ubuntu

সিএমডি পাত্রে ডিফল্ট যুক্তি argument এন্ট্রিপয়েন্ট ছাড়াই ডিফল্ট আর্গুমেন্ট হ'ল কমান্ড যা সম্পাদিত হয়। এন্ট্রিপয়েন্ট সহ, সেন্টিমিডিটি আর্গুমেন্ট হিসাবে এন্ট্রিপয়েন্টে পাস করা হয়। আপনি এন্টিপয়েন্ট সহ একটি কমান্ড অনুকরণ করতে পারেন।

# no entrypoint
docker run ubuntu /bin/cat /etc/passwd

# with entry point, emulating cat command
docker run --entrypoint="/bin/cat" ubuntu /etc/passwd

সুতরাং, প্রধান সুবিধা হ'ল এন্ট্রিপয়েন্টের সাহায্যে আপনি আপনার ধারকটিতে যুক্তি (সেমিডি) পাস করতে পারেন। এটি সম্পাদন করার জন্য, আপনাকে উভয়টি ব্যবহার করতে হবে:

# Dockerfile
FROM ubuntu
ENTRYPOINT ["/bin/cat"]

এবং

docker build -t=cat .

তাহলে আপনি ব্যবহার করতে পারেন:

docker run cat /etc/passwd
#              ^^^^^^^^^^^
#                   CMD
#          ^^^      
#          image (tag)- using the default ENTRYPOINT

@ ব্লাউহিরন আপনার ক্ষেত্রে, আপনাকে অবশ্যই তালিকা বাক্য গঠনে সিএমডি-তে যুক্তি যুক্ত করতে হবে এবং নিশ্চিত করা উচিত যে আপনি যে প্রবেশপথটি পৃথক করেছেন সেগুলি আপনার যুক্তিগুলি সিএমডি-তে পার্স করতে পারে। সাধারণত, আমি এন্ট্রিপয়েন্টে একটি '-h' যুক্তি যুক্ত করি। তারপরে আমি docker run image_name -hএই চিত্রটির কিছু সহায়তা তথ্য দেখানোর জন্য নির্বাহ করতে পারি ।
লাইট.জি

1
এটি সবচেয়ে সহজ এবং স্পষ্ট উত্তর।
এরিক ওয়াং

44

স্বীকৃতি দ্বারা সিএমডি এবং ENTRYPOINT মধ্যে পার্থক্য :

  • ENTRYPOINT: কন্টেইনার শুরু হওয়ার পরে চালানোর কমান্ড।
  • সিএমডি: কন্টেইনার শুরু হওয়ার পরে চালানো কমান্ড বা নির্দিষ্ট করা থাকলে ENTRYPOINT এ যুক্তি প্রদর্শন করুন।

হ্যাঁ, এটি মিশ্রিত হচ্ছে।

ডকার রান চলাকালীন আপনি এগুলির যে কোনও একটিকে ওভাররাইড করতে পারেন।

সিএমডি এবং ENTRYPOINT মধ্যে পার্থক্য উদাহরণস্বরূপ :

docker run -it --rm yourcontainer /bin/bash            <-- /bin/bash overrides CMD
                                                       <-- /bin/bash does not override ENTRYPOINT
docker run -it --rm --entrypoint ls yourcontainer      <-- overrides ENTRYPOINT with ls
docker run -it --rm --entrypoint ls yourcontainer  -la  <-- overrides ENTRYPOINT with ls and overrides CMD with -la

CMDএবং এর মধ্যে পার্থক্য সম্পর্কে আরও ENTRYPOINT:

আর্গুমেন্ট প্রাপ্ত করতে docker runযেমন / বিন / ব্যাশ ওভাররাইড কোনো সিএমডি কমান্ড আমরা Dockerfile লিখেছে।

ENTRYPOINT যেমন চালানো সময়ে সাধারণ কমান্ডগুলির সাথে ওভাররাইড করা যায় না docker run [args]argsশেষে এর docker run [args]ENTRYPOINT আর্গুমেন্ট হিসাবে প্রদান করা হয়। এইভাবে আমরা containerএকটি সাধারণ বাইনারি এর মতো একটি তৈরি করতে পারি ls

সুতরাং সিএমডি ENTRYPOINT- এ ডিফল্ট পরামিতি হিসাবে কাজ করতে পারে এবং তারপরে আমরা [আর্টস] থেকে সিএমডি আরোগুলিকে ওভাররাইড করতে পারি।

ENTRYPOINT এর সাথে ওভাররাইড করা যায় --entrypoint


38

সংক্ষেপে:

  • সিএমডি ডিফল্ট কমান্ড এবং / অথবা পরামিতি সেট করে, যা ডকার কন্টেইনার চললে কমান্ড লাইন থেকে ওভাররাইট করা যায়।
  • ENTRYPOINT কমান্ড এবং পরামিতিগুলি কমান্ড লাইন থেকে ওভাররাইট করা হবে না। পরিবর্তে, সমস্ত কমান্ড লাইন যুক্তি ENTRYPOINT পরামিতি পরে যুক্ত করা হবে।

আপনার যদি আরও বিশদ বিবরণ প্রয়োজন হয় বা উদাহরণের মধ্যে পার্থক্য দেখতে চান তবে এমন একটি ব্লগ পোস্ট রয়েছে যা সিএমডি এবং ENTRYPOINT কে প্রচুর উদাহরণের সাথে সম্পূর্ণরূপে তুলনা করে - http://goinbigdata.com/docker-run-vs-cmd-vs-entryPoint/


21

আমি আমার উত্তর 1 হিসাবে যুক্ত করব যা পার্থক্যটি আরও ভালভাবে বুঝতে আপনাকে সহায়তা করতে পারে।

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

FROM ubuntu
CMD sleep 10

এখন, আমরা চিত্রটি তৈরি করি:

docker build -t custom_sleep .
docker run custom_sleep
# sleeps for 10 seconds and exits

আমরা যদি সেকেন্ডের সংখ্যাটি পরিবর্তন করতে চাই? Dockerfileসেখানে মানটি হার্ডকোডযুক্ত হওয়ায় আমাদের মানটি পরিবর্তন করতে হবে, বা ভিন্ন একটি সরবরাহ করে আদেশটি ওভাররাইড করতে হবে:

docker run custom_sleep sleep 20

এটি কাজ করার সময় এটি কোনও ভাল সমাধান নয়, কারণ আমাদের কাছে অনর্থক "ঘুম" কমান্ড রয়েছে (ধারকটির উদ্দেশ্য ঘুমানো , সুতরাং স্পষ্টভাবে sleepআদেশটি নির্দিষ্ট করে রাখা ভাল অনুশীলন নয়)।

এখন ENTRYPOINTনির্দেশ ব্যবহার করার চেষ্টা করুন :

FROM ubuntu
ENTRYPOINT sleep

এই নির্দেশিকাটি সেই প্রোগ্রামটিকে নির্দিষ্ট করে যা কনটেইনার শুরু হওয়ার পরে চালানো হবে

এখন আমরা চালাতে পারি:

docker run custom_sleep 20

ডিফল্ট মান সম্পর্কে কী? ঠিক আছে, আপনি এটি সঠিকভাবে অনুমান করেছেন:

FROM ubuntu
ENTRYPOINT ["sleep"]
CMD ["10"]

ENTRYPOINTপ্রোগ্রাম যা চলবে, এবং ধারক প্রেরণ মান এটি যোগ করা হবে।

ENTRYPOINTএকটি নির্দিষ্ট করে ওভাররাইড করা যেতে পারে --entrypointপতাকা, নতুন এন্ট্রি পয়েন্ট আপনি ব্যবহার করতে চান করে।

আমার নয়, আমি একবার একটি টিউটোরিয়াল দেখেছি যা এই উদাহরণটি সরবরাহ করে


1
টিউটোরিয়ালের লিঙ্কটি এখানে: youtu.be/OYbEWUbmk90 । এটি ভবিষ্যতের ব্যবহারকারীদের পক্ষে উপকারী হতে পারে।
চিপ্লাস প্লাস প্লাস

16

গৃহীত উত্তরটি ইতিহাস ব্যাখ্যা করার জন্য কল্পিত। 'এই সিএমডি এবং ENTRYPOINT কীভাবে মিথস্ক্রিয়া হয়' সম্পর্কে অফিসিয়াল ডক থেকে এই টেবিলটি এটি খুব ভালভাবে ব্যাখ্যা করে দেখতে পেয়েছি : এখানে চিত্র বর্ণনা লিখুন


7

কোড এন্ট্রিপয়েন্ট পয়েন্ট সম্পর্কে মন্তব্য

// ENTRYPOINT / usr / sbin / nginx।

// এন্ট্রিপয়েন্টটি সেট করুন (যা sh -c তে ডিফল্ট) / usr / sbin / nginx এ সেট করুন।

// / usr / sbin / nginx- তে আর্গুমেন্ট হিসাবে সিএমডি গ্রহণ করবে।

নথি থেকে অন্য রেফারেন্স

মোটামুটি স্থিতিশীল ডিফল্ট কমান্ড এবং যুক্তিগুলি সেট করতে আপনি ENTRYPOINT এর এক্সিকিউট ফর্মটি ব্যবহার করতে পারেন এবং তারপরে পরিবর্তিত হওয়ার সম্ভাবনা রয়েছে এমন অতিরিক্ত ডিফল্ট সেট করতে সিএমডি ব্যবহার করতে পারেন।

উদাহরণ:

FROM ubuntu:14.04.3
ENTRYPOINT ["/bin/ping"]
CMD ["localhost", "-c", "2"]

বিল্ড : sudo ডকার বিল্ড -t ent_cmd।

CMD arguments are easy to override.

NO argument (sudo docker -it ent_cmd)                :  ping localhost 
argument    (sudo docker run -it ent_cmd google.com) :  ping google.com

To override EntryPoint argument, you need to supply entrypoint
sudo docker run -it --entrypoint="/bin/bash" ent_cmdd

PS: এন্ট্রিপয়েন্টের উপস্থিতিতে, সিএমডি এন্ট্রিপয়েন্টে খাওয়ানোর জন্য যুক্তি রাখবে। এন্ট্রিপয়েন্টের অনুপস্থিতিতে, সিএমডি হ'ল কমান্ড যা চালানো হবে।


3

CMDDockerfileফাইলের ভিতরে উল্লিখিত কমান্ড কমান্ডের মাধ্যমে ওভাররাইড করা যেতে পারে docker runযখন ENTRYPOINTতা করা যায় না।


4
docker run --helpকমান্ড অন্যথায় বলেছেন:--entrypoint string Overwrite the default ENTRYPOINT of the image
iomv

3

আমি সমস্ত উত্তর পড়েছি এবং নীচের মত প্রথম নজরে আরও ভাল বোঝার জন্য সংক্ষিপ্ত করতে চাই:

প্রথমত, পুরো কমান্ডটি যা ধারকটিতে কার্যকর করা হয় তার দুটি অংশ রয়েছে: আদেশ এবং আর্গুমেন্ট

  • ENTRYPOINT কনটেইনার শুরু হওয়ার সাথে সাথে এক্সিকিউটেবল ইনভয়েটেডকে সংজ্ঞায়িত করে (কমান্ডের জন্য)

  • সিএমডি ENTRYPOINT (আর্গুমেন্টের জন্য) পাস করার যুক্তিগুলি নির্দিষ্ট করে

ইন Kubernetes কর্ম বই এটি সম্পর্কে একটি গুরুত্বপূর্ণ নোট স্থানটিকে চিহ্নিত করে। (অধ্যায় 7)

যদিও আপনি চিত্রটি চালনার সময় কার্যকর করতে চান সেই আদেশটি নির্দিষ্ট করতে সিএমডি নির্দেশ ব্যবহার করতে পারেন , সঠিক উপায়টি এটি ENTRYPOINT নির্দেশের মাধ্যমে করা এবং কেবলমাত্র সিএমডি নির্দিষ্ট করা যদি আপনি ডিফল্ট আর্গুমেন্টগুলি সংজ্ঞায়িত করতে চান।

আপনি একটি সহজ উপায়ে দুর্দান্ত ব্যাখ্যা জন্য এই নিবন্ধটি পড়তে পারেন


2

সিএমডি:

  • CMD ["executable","param1","param2"]: ["executable","param1","param2"]প্রথম প্রক্রিয়া।
  • CMD command param1 param2: /bin/sh -c CMD command param1 param2প্রথম প্রক্রিয়া। CMD command param1 param2প্রথম প্রক্রিয়া থেকে কাঁটাচামচ করা হয়।
  • CMD ["param1","param2"]: এই ফর্মটি ডিফল্ট আর্গুমেন্ট সরবরাহ করতে ব্যবহৃত হয় ENTRYPOINT

ENTRYPOINT (সিএমডি এবং ENTRYPOINT একসাথে ব্যবহৃত হয় যেখানে নিম্নলিখিত তালিকাটি বিবেচনা করে না):

  • ENTRYPOINT ["executable", "param1", "param2"]: ["executable", "param1", "param2"]প্রথম প্রক্রিয়া।
  • ENTRYPOINT command param1 param2: /bin/sh -c command param1 param2প্রথম প্রক্রিয়া। command param1 param2প্রথম প্রক্রিয়া থেকে কাঁটাচামচ করা হয়।

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


2

বেশিরভাগ লোকেরা এখানে পুরোপুরি ব্যাখ্যা করে, তাই আমি সমস্ত উত্তর পুনরাবৃত্তি করব না। তবে একটি ভাল অনুভূতি পাওয়ার জন্য আমি ধারকটির প্রক্রিয়াগুলি দেখে এটি নিজেই পরীক্ষার পরামর্শ দেব।

ফর্মটির একটি ক্ষুদ্র ডকফাইল তৈরি করুন:

FROM ubuntu:latest
CMD /bin/bash

এটি তৈরি করুন, এটি দিয়ে docker run -it theimageচালান ps -eo ppid,pid,argsএবং পাত্রে চালান । এই আউটপুটটির সাথে পিএস থেকে প্রাপ্ত আউটপুটটির সাথে তুলনা করুন:

  • docker run -it theimage bash
  • চিত্রটি পুনর্নির্মাণ কিন্তু ENTRYPOINT /bin/bashএটি দুটি উপায়েই চালাচ্ছে
  • ব্যবহার CMD ["/bin/bash"]
  • ...

এইভাবে আপনি নিজের জন্য সম্ভাব্য সমস্ত পদ্ধতির মধ্যে পার্থক্য সহজেই দেখতে পাবেন।


0

ডকফাইফাইল সেরা অনুশীলনের অফিশিয়াল ডকুমেন্টেশন পার্থক্য ব্যাখ্যা করার জন্য দুর্দান্ত কাজ করে। ডকফায়ফাইল সেরা অনুশীলন

সিএমডি:

সিএমডি নির্দেশাবলী কোনও যুক্তি সহ আপনার চিত্রের অন্তর্ভুক্ত সফ্টওয়্যারটি চালাতে ব্যবহার করা উচিত। সিএমডি প্রায় সর্বদা আকারে ব্যবহার করা উচিত CMD ["executable", "param1", "param2"…]। সুতরাং, যদি চিত্রটি অ্যাপাচি এবং রেলগুলির মতো কোনও পরিষেবার জন্য হয় তবে আপনি এমন কিছু চালাবেন CMD ["apache2","-DFOREGROUND"]। প্রকৃতপক্ষে, নির্দেশের এই ফর্মটি কোনও পরিষেবা-ভিত্তিক চিত্রের জন্য প্রস্তাবিত।

ENTRYPOINT:

ENTRYPOINT- র সর্বোত্তম ব্যবহার হ'ল চিত্রটির প্রধান কমান্ড সেট করা, সেই চিত্রটি চালানোর অনুমতি দেয় যেন এটি সেই কমান্ড (এবং তারপরে সিএমডি ডিফল্ট পতাকা হিসাবে ব্যবহার করে)।

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