بدأت الطريقة الصحيحة للحفاظ على حاوية عامل الميناء عند استخدامها للمهام الدورية

لدي حاوية عامل ميناء مع البرامج المثبتة وتكوينها.

لا يوجد أي برنامج من المفترض أن يبدأ / يتم تشغيله طوال الوقت.

ما أريد-قدرته على بدء بعض الأوامر اعتمادا على الأحداث الخارجية. مثل:

docker exec mysupercont /path/to/mycommand -bla -for

و

docker exec mysupercont /path/to/myothercommand 

ولكن" إكسيك "مستحيل عندما يتم إيقاف الحاوية ، وأيضا هذه الحاوية لديها بعض البيانات" العمل " في الداخل، والتي تستخدم لتلك الأوامر، لذلك لا أستطيع استخدام

docker run ...

في كل مرة ، لأنه إعادة إنشاء حاوية من الصورة وتدمير البيانات الخاصة بي.

ما هو" الحق "و" أفضل " طريقة للحفاظ على هذه الحاوية مسننة? الأمر الذي يمكنني البدء فيه?

لا تحتاج إلى أداء كل مرة docker run.

docker run هو في الواقع سلسلة من أمرين:" إنشاء "و"ابدأ".

عند تشغيل الحاوية ، يجب تحديد "-it":

التفاعلية = كاذبة تبقي ستدين مفتوحة حتى لو لم تعلق
- تي ،ty تي=كاذبة تخصيص شبه تي

مثال:

docker run -it debian:stable bash

بعد اكتمال العمل الأمر المحدد عند بدء التشغيل (في بلدي سبيل المثال باش). على سبيل المثال ، يمكنك تنفيذ "الخروج". توقف الحاويات:

CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS                     PORTS               NAMES1329c99a831b        debian:stable              "bash"                 51 seconds ago      Exited (0) 1 seconds ago                       goofy_bardeen

الآن يمكنك البدء من جديد

docker start 1329c99a831b

يتم تشغيل الحاوية ومرة أخرى ينفذ الأمر "باش".
الاتصال بهذه الدورة " باش " مع الأمر

docker attach 1329c99a831b

لتلخيص: عليك أن تفهم الفرق بين run و start حاوية.
الى جانب ذلك ، انظر إلى الوثائق لدور المعلمات "-i t"و"-d"من أجل "تشغيل"

منذ ذكرتم المهام الدورية وربما كنت تستخدم شيئا مثل كرون بسبب الطريقة التي تريد استخدامها docker exec، لدي فقط الدواء لك. على الأقل انتهى بي الأمر بفعل شيء من هذا القبيل.

  1. دوكيرفيل

    FROM <some base>CMD tail -f /dev/null
  2. تشغيل مع المعتاد docker run -d .... (اعتدت docker-compose)

  3. إعداد آلات المضيف كرونتاب ، على سبيل المثال:

    * * * * * docker exec mysupercont foo >> /var/log/foo.log 2>&1* * * * * docker exec mysupercont bar >> /var/log/bar.log 2>&1

أجد هذا الحل لطيفة كما نصل إلى الاعتماد على كرونتاب القديمة وثبت في بيئة لينكس الافتراضي جميلة ، في حين عامل الميناء يعالج ديبس منطق عملك أكثر غرابة ومتغيرات البيئة. يمكنك أيضا تعيين بعض الحدود إذا المهام الدورية الخاصة بك تتعثر & أمبير; لديك تسرب الذاكرة أو أيا كان.

سوف الذيل لا يزال يسبب بعض عمليات الملف من وقت لآخر.

النوم إلى الأبد ، دون أي آثار جانبية

# Ah, ha, ha, ha, stayin' alive...while :; do :; done & kill -STOP $! && wait $!

كيف يعمل

while :;           # Run an endless loop,do :;              # of do nothing,done &             # as background task.kill -STOP $!      # Stop the background task.wait $!            # Wait forever, because background task process has been stopped.

هذا العمل كله من ما إذا كان أو لا يمكنك بدء حاوية توقف ، يعتمد على كيفية إنشاء الحاوية في الأصل ، أي تشغيل. إذا قمت بتشغيل أمر انتهى ، أو قمت بإنهاء أمر تفاعلي ، على سبيل المثال باش ، لا يمكنك بدء أو إعادة تشغيل أو إكسيك الحاوية توقف. كل ما يمكنك فعله هو إزالته. انها غير المرغوب فيه.

ولكن التعليق الأخير تاراناكي ، واستخدام '- إيتد ' ، ويبدو أن ما أمر عامل الميناء.

الحاوية تبقي قيد التشغيل ، ويمكنك إكسيك كل ما تريد ، ويمكنك إيقاف ، بدء أو إعادة تشغيل الحاوية. بالطبع ، هذه مجرد نتيجة أولية تستند إلى صورة جبال الألب. ملاحظة ، إذا كنت نعلق على الحاوية ، وسوف تتوقف عند الخروج ، ولكن يمكنك تشغيله مرة أخرى.

لقد استخدمت كل الحلول المقترحة هنا نفسي ، ولكن كل منهم لا تتعامل مع إشارات سيغتيرم القادمة من الخفي عامل الميناء عندما يريد إغلاق الحاوية (على سبيل المثال. docker stop $containername).

لذلك أقترح ما يلي:

FROM base:image# ...CMD sh -c 'trap "exit" TERM; while true; do sleep 1; done'

انها اساسا النصي قذيفة قصيرة أن يعترض أولا (&مثل; الفخاخ & مثل;) إشارات سيغتيرم ثم يذهب إلى النوم لثانية واحدة في حلقة لا نهائية.

أنا أساسا استخدامه جنبا إلى جنب مع عامل الميناء يؤلف و أوفيليا لتزويد حاويات السيارات الجانبية للنسخ الاحتياطي لبعض الخدمات الأخرى في حاوية أخرى (مثل قواعد بيانات ماريادب).

'عامل الميناء تشغيل - د name اسم = اسم حاوية الذيل-و / ديف / نول`

هذا سؤال مفسر جيدا. انظر وظيفة أخرى مماثلةhere.