كيف يمكنني إعادة تشغيل حاويات عامل الإرساء تلقائيا باستخدام الحذف التلقائي للحاوية?

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

لكل التطبيق لدي النصي البداية. حاوية وورد يشبه هذا:

#!/bin/bash# Get the host IP addressexport DOCKER_HOSTIP=`ifconfig docker0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1`echo "Connecting to database on Docker host ${DOCKER_HOSTIP}"docker run \    --add-host=docker:${DOCKER_HOSTIP} \    --network dockernet \    --network-alias jonblog \    --detach \    --restart always \    --rm \    jonblog

ومع ذلك ، يقوم بإرجاع خطأ:

خيارات متضاربة :restart إعادة التشغيل و r جمهورية مقدونيا

هناك العديد من تذاكر عامل الميناء التي تقول إن هذا معقول ، لكنني لا أفهمه. أعتقد أن المعنى واضح: إذا كانت الحاوية لا تعمل (على سبيل المثال عند بدء التشغيل) ، فأنا أريد أن أبدأ تشغيلها. إذا مات ثم أتوقع إزالة الحاوية ، واحدة جديدة جديدة تم إنشاؤها من الصورة الأساسية. يجب أن تكون الحاويات غير قابلة للتغيير على أي حال - أي حالة أرغب في الحفاظ عليها ، مثل ملفات الوسائط والسجلات ، ستتم كتابتها إلى مجلدات.

وبالتالي, اعتقدت أنني يجب أن أسقط --restart ضع علامة ، ثم استخدم مدير العمليات لإيقاف حاويات عامل الإرساء وبدء تشغيلها. هل يمكنني استخدام مونيت هنا? كنت آمل أن أكون قادرا على فعل شيء مثل:

CHECK PROCESS jonblog MATCHING jonblog  START PROGRAM = "/root/docker/jonblog/host-start.sh"  STOP PROGRAM = "docker stop jon-blog"

ومع ذلك ، هذا يتحقق من جدول عملية النظام ، وليس docker ps، وبالتالي لن تجد شيئا يطابق السلسلة المحددة. هل يمكنني الحصول عليه إلى إكسيك docker ps دوري, وخطوط المباراة في الإخراج?

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

توضيح بشأن-جمهورية مقدونيا

السبب لماذا أريد --rm هل هذا أثناء عملية الإرساء ، أوقف الحاوية قيد التشغيل حاليا, load نسخة جديدة من الصورة ، وإعادة تشغيل البرنامج النصي أعلاه. وهذا يعني أنه يتم إخطار عامل الميناء من restart سياسة لكل حاوية. لقد وجدت أنه بعد إعادة تشغيل المربع ، سيكون لدي 15 إصدارا مختلفا قليلا من التطبيق يعمل في وقت واحد ، وهذا ليس القصد.

أفترض أنني يمكن استخدام docker update --restart never على الحاويات القديمة لمنع حدوث ذلك ، ولكن بعد ذلك عندما يتوقف حاوية بلدي ، وأنا تركت معها الكذب حولها ، وكنت فقط في أقرب وقت يكون ذلك لصناعة السيارات في حذف. يمكنني تنظيف القديمة بشكل دوري باستخدام نوع من وظيفة كرون ، ولكن هذا يشعر قليلا هاكي بالنظر إلى أن عامل الميناء يمكن أن تفعل ذلك بالنسبة لي.

البحث عن مجموعة من الإجابات

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

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

من أعلى قبالة رأسي ، ويمكنني أن أكتب حلقة قذيفة لكتابة docker ps إلى ملف كل خمس ثوان لمدة دقيقة ، ثم قم بتشغيل ذلك على كرون كل دقيقة. يمكنني بعد ذلك مسح هذا الملف باستخدام grep و مونيت CHECK PROGRAM فحص النظام. هذا هو هاكي قليلا ، ولكن هو شيء أستطيع أن أفهم بسهولة إذا كان هناك مشكلة معها. أي تقدم على هذا الاقتراح?

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

وهكذا ، شرعت في حل هذه المشكلة بطريقة بسيطة. كان لدي خياران:

  1. استخدم ميزة الحذف التلقائي للحاوية في عامل الميناء ، وقم بإعداد نظام إعادة التشغيل الخاص بي
  2. استخدم نهج إعادة تشغيل عامل الميناء ، وقم بإعداد نظام حذف الحاوية الخاص بي

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

في الواقع ، كان الخيار الثاني أنظف بكثير ، وقد تم تضخيم ذلك من خلال حقيقة أن تنظيف الحاويات المتوقفة ليس في الواقع أولوية-إنه فقط للحفاظ على الأشياء مرتبة. بالطبع ، لقد استخدمت عامل الميناء لهذا ؛ ها هي Dockerfile:

# Docker build script for Docker TidyFROM alpine:3.6RUN apk updateRUN apk add docker# See this for BusyBox cron schedules# https://gist.github.com/andyshinn/3ae01fa13cb64c9d36e7COPY bin/docker-tidy.sh /etc/periodic/daily/RUN chmod +x /etc/periodic/daily/docker-tidy.sh# Start Cron in the foregroundENTRYPOINT ["crond", "-l", "2", "-f"]

وهنا bin/docker-tidy.sh:

#!/bin/sh## With thanks to:# http://www.doublecloud.org/2015/05/simple-script-to-list-and-remove-all-stopped-docker-containers/docker rm -v $(docker ps -a -q -f status=exited)

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

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

#!/bin/bash# Removes the restart policy from previous containersCONTAINER_LABEL=docker-tidy-instancedocker ps --all --filter label=$CONTAINER_LABEL --quiet | xargs --no-run-if-empty docker update --restart nodocker run \    --label $CONTAINER_LABEL \    --volume /var/run/docker.sock:/var/run/docker.sock \    --detach \    --restart always \    docker-tidy

اذهب للعب مع مينيكوب يمكنك الحصول على ذلك في حوالي خمس دقائق.

عادل بما فيه الكفاية ، @مايكل. يمكنني أن أفعل ذلك مع مونيت (على أساس أنا على دراية إلى حد ما معها)? نظرت في صفحة الرجل, ولكن هذا هو وحش للقراءة, وفقدت الرغبة في العيش عندما الخوض من خلال ذلك. أتساءل على الرغم من ذلك ، من المستندات ، ما إذا كان فحص البرنامج ستعمل-إذا كان بإمكاني التسلل إلى معلمة في المسار القابل للتنفيذ ، فيمكنه إرجاع النجاح/الفشل اعتمادا على ما إذا كانت الحاوية المسماة قيد التشغيل.

من المحتمل أن تكون هناك طريقة أكثر توجها نحو عامل الميناء للقيام بذلك ، لكن بحثي-فو لا يظهر أي شيء مثير للاهتمام بشكل خاص.

بصراحة إذا كنت إعادة بناء الحاويات التي في كثير من الأحيان ، يجب أن تستخدم شيئا مثل كوبرنيتس لإدارة الأمور.

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

(تعليق هنا قبل خمس دقائق ، حذف الآن ، وقال أنني بحاجة فقط ‘إعادة تشغيل’. نعم ، هذا من شأنه أن يعمل ، ولكن أود بعد ذلك أن تتخلى عن r آرإم ' - أنا يمكن أن يكون واحد أو آخر ، ولكن ليس على حد سواء ، نظرا للخطأ أظهرت في السؤال. انظر تحرير التوضيح حول لماذا أعتقد أن r آرإم ’ مطلوب).

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