وأعتقد أن الفرق قد يكون لأن الأمر الثاني لا معالجة قذيفة في حين أن الأول لا. لكل ال الوثائق الرسمية، هناك exec و shell النماذج. الأمر الأول الخاص بك هو exec شكل. ال exec النموذج لا يوسع متغيرات البيئة بينما shell النموذج يفعل. فمن الممكن أن باستخدام exec شكل فشل الأمر بسبب اعتماده على معالجة القشرة. يمكنك التحقق من ذلك عن طريق تشغيل docker logs CONTAINERID
ملاحظة: على عكس نموذج شل ، لا يستدعي نموذج إكسيك قذيفة الأوامر. هذا يعني أن معالجة القشرة العادية لا تحدث. على سبيل المثال, CMD [ "echo", "$HOME" ] لن تفعل استبدال متغير على $HOME. إذا كنت تريد معالجة قذيفة ثم إما استخدام شكل قذيفة أو تنفيذ قذيفة مباشرة ، على سبيل المثال: CMD [ "sh", "-c", "echo", "$HOME" ].
بناء جملة جسون من CMD (و RUN و ENTRYPOINT) تمرير الحجج إلى النواة مباشرة كما سيسكال إكسيك. لا يوجد فصل للأمر من الوسيطات عن طريق المسافات ، والهروب من علامات الاقتباس ، وإعادة توجيه إو ، واستبدال متغير ، والأنابيب بين الأوامر ، وتشغيل أوامر متعددة ، وما إلى ذلك ، في سيسكال إكسيك. سيسكال يأخذ فقط قابل للتنفيذ لتشغيل وقائمة من الحجج لتمرير إلى أن قابل للتنفيذ ، وتشغيله.
شخصيات مثل $ لتوسيع المتغيرات, ; لفصل الأوامر, (الفضاء) لفصل الحجج, && و || إلى سلسلة الأوامر, > لإعادة توجيه الإخراج, | إلى الأنابيب بين الأوامر ، وما إلى ذلك ، كلها ملامح قذيفة وتحتاج إلى شيء من هذا القبيل /bin/sh أو /bin/bash لتفسيرها وتنفيذها.
إذا قمت بالتبديل إلى بناء الجملة سلسلة من CMD، عامل الميناء سيتم تشغيل الأمر الخاص بك مع قذيفة:
لاحظ أنني لا أوصي بتشغيل أوامر متعددة بهذه الطريقة داخل الحاوية نظرا لعدم وجود معالجة للخطأ في حالة فشل الأمر الأول، خاصة إذا كان يعمل في الخلفية. يمكنك أيضا ترك قذيفة تشغيل كما بيد 1 داخل الحاوية التي سوف كسر التعامل مع إشارة ، مما أدى إلى تأخير 10 ثانية وقتل نكران من الحاوية الخاصة بك عن طريق عامل الميناء. يمكن تخفيف معالجة الإشارة باستخدام الغلاف exec القيادة:
ومع ذلك ، فإن معالجة العمليات التي تفشل بصمت في الخلفية تتطلب منك التبديل إلى نوع من مدير العمليات المتعددة مثل المشرف ، أو يفضل تقسيم التطبيق الخاص بك إلى حاويات متعددة ونشرها مع شيء مثل عامل الميناء يؤلف.