تفاوت دستورات cmd و entrypoint در داکر

امیرحسین بیگدلو 12 ماه قبل

در زمان کار با داکر، اغلب افراد در استفاده از دستورات CMD و ENTRYPOINT دچار مشکل میشوند. در این مقاله تفاوت این دو دستور در داکر را یاد میگیریم. تفاوت اصلی بین CMD و ENTRYPOINT در Docker این است که از نظر اجرا، آرگومان های پیش فرض ارائه شده توسط CMD می توانند بازنویسی شوند، در حالی که آرگومان های ارائه شده توسط ENTRYPOINT نمی توانند بازنویسی شوند.

 

# تفاوت CMD و ENTRYPOINT داکر

فرض کنید که میخواهید ایمیجی (image) بسازید که قرار است هر بار به آدرس www.google.com یک ping ارسال کند. برای ساخت این ایمیج ابتدا سیستم عامل ubuntu را به عنوان لایه پایه قرار داده و سپس ابزارهای مورد نیاز برای ارسال ping را نصب میکنید. اکنون داکرفایل به شکل زیر است:

# Base Image
FROM ubuntu:20.04

# Required Installation
RUN apt-get update && apt-get -y install iputils-ping

در مرحله بعد باید نحوه ارسال ping را مشخص کنید. برای اجرای ping میتوانید از دستور CMD استفاده کنید:

# Base Image
FROM ubuntu:20.04

# Required Installation
RUN apt-get update && apt-get -y install iputils-ping

CMD ["ping", "www.google.com"]

حالا میتوانید با دستورات زیر، یک ایمیج از این داکرفایل ایجاد کنید و آن ایمیج را اجرا کنید:

docker build -t pinger .

docker run -d pinger

دقت کنید که در دستورات بالا، pinger نام داکرفایل است. با اجرای دستورات بالا، یک ping به www.google.com ارسال میشود.

اما در این داکرفایل ما میتوانستیم به جای استفاده از دستور CMD، از دستور ENTRYPOINT استفاده کنیم که در اینصورت داکرفایل به شکل زیر تغییر پیدا میکند:

# Base Image
FROM ubuntu:20.04

# Required Installation
RUN apt-get update && apt-get -y install iputils-ping

ENTRYPOINT ["ping", "www.google.com"]

دوباره میتوانیم با اجرای دستورات بالا، یک ایمیج از این داکرفایل ایجاد کرده و آن را اجرا کنیم. در اینصورت دستور ping دوباره به درستی اجرا خواهد شد. همانطور که متوجه شدید، تا اینجا تفاوتی بین CMD و ENTRYPOINT وجود نداشته است.

دوره پیشنهادی: دوره آموزش داکر

# ارائه آرگومان اضافی از طریق ترمینال

قبل از اینکه بخواهیم تفاوت بین این دو را بررسی کنیم، بهتر است کمی به دستور docker run توجه کنیم. سینتکس این دستور به شکل docker run <optional flags> <image name> <command> است. مقدار d- یک آپشن اختیاری است، مقدار pinger نام ایمیج است، و هر چیزی که بعد از نام ایمیج قرار میگیرد بخشی از دستور ما خواهد شد که به CMD/ENTRYPOINT داده می شود.

 

ما اکنون هر دو داکرفایل خود را از قبل می سازیم و اجرا می کنیم، فقط این بار آرگومان های اضافی را به دستور docker run ارسال می کنیم. ابتدا داکرفایل خود را حاوی دستور CMD می سازیم و با استفاده از دستور زیر اجرا می کنیم:

docker run -d pinger ping www.youtube.com 

می بینیم که برنامه ما اکنون به جای www.google.com به www.youtube.com پینگ را ارسال می کند. آرگومان های اضافی که به دستور docker run ارائه می کنیم جایگزین آرگومان های موجود تعریف شده در داکرفایل می شوند و این همان چیزی است که اجرا می شود:

ping www.youtube.com

 

سپس داکرفایل حاوی دستور ENTRYPOINT را اجرا می کنیم و با استفاده از دستور زیر آن را اجرا می کنیم:

docker run -d pinger ping www.youtube.com

اما در این مورد، برنامه www.google.com را پینگ می کند و سپس بلافاصله متوقف میشود. آرگومان های اضافی به دستور docker run به آرگومان های موجود تعریف شده در داکرفایل اضافه می شوند، بنابراین این چیزی است که ما سعی می کنیم اجرا کنیم:

ping www.google.com ping www.youtube.com

از آنجا که این دستور حاوی یک خطای نحوی است، دستور کامل اجرا نمی شود و برنامه ما خارج می شود. برای رفع این مشکل، می‌توانیم دستور اجرای docker خود را برای اضافه کردن && در ابتدای آرگومان‌های اضافی تغییر دهیم:

docker run -d pinger && ping www.youtube.com

در نتیجه دستور زیر را اجرا خواهد شد:

ping www.google.com && ping www.youtube.com

و اکنون می‌توانیم ببینیم که برنامه ما هم www.google.com و هم www.youtube.com را پینگ می‌کند.

مطالب مشابه



مونگارد