دائما مع Dockerfiles .. كاينين 3 ديال Commands لي لي تايمكنونا نexecutew commands، لي هوما RUN و CMD و ENTRYPOINT .
- بالنسية لRUN الCommand تاتexecuta وسط الimage براسها، يعني منين تاندير docker build .
# dockerfile
...
RUN apt-get update && apt-get install curl
...
# ---
# this will be executed when we'll call this
$ docker build -t devc:rabat .
- بالنسبة لCMD و ENTRYPOINT تايexecutaw منين تانرانيو container ديالنا. يعني Docker run
# dockerfile
...
CMD curl Devc.com
...
# ---
# this will be executed when we'll call this
$ docker run devc:rabat
حاجة أخرى مهمة هي أنن هاذ الكوماندس ممكن ياخدو 2 أشكال
- الEXEC Form و هنا تانعطيو الbinary لي بغينا نexecutew مع باراميترز ديالو على شكل array و docker تايمشي يقلب في الPATH و تايقضي الغرض
# dockerfile
...
RUN ["apt", "install", "-y", "curl"]
CMD ["/bin/curl", "https://devc.com"]
...
- الSHELL form لي تانعطيو فيها commands لي بغينا على شكل string هاذ المرة و Docker تايدوزهم للشيل الشهير sh باش يexecutehom
# dockerfile
...
RUN apt install -y curl
# is equivalent to
CMD ["/bin/sh", "-c", "apt install -y curl"]
ملاحظات:
- بالنسبة لshell form، في حالة CMD أو ENTRYPOINT الpid 1 تايكون هو sh و هاذشي لي تايمنعنا من أننا نتواصلو مع الexecutable ديالنا مباشرة باستعمال Unix Signals يعني ايلا كان عندك شي program تاي...handle CTRL+C or CTRL+Z بشي طريقة في شكل من الأحسن تستعمل EXEC form .. حيت في هاذ الحالة غادي يكون sh حاجز بينك و بين البروكّرام ديالك و هو لي غادي يتكلف ب signals.
- كاين فرق بين CMD و ENTRYPOINT غادي نهضرو عليه المرة الجاية