بدء التبعيات المرتبطة بحاوية عامل الميناء تلقائيا

أركض جيتلاب في حاوية عامل الميناء ويفصل تبعياتها (ميسكل ، ريديس ، ميلسيرفر) لطيف جدا في حاويات دوكر منفصلة. تشغيلها ليست مشكلة ، وأبدأ لهم في ترتيب عكسي: التبعيات أولا ، من جيتلاب نفسها.

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

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

حالة استخدامك لتشغيل جيتلاب هو في الأساس نفس الشكل-وورد سبيل المثال أو باستخدام جيتلاب-كتابة السيناريو

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

أعتقد أنه يمكنك النظر إلى التزيين

كما يمكنك إدارة التبعيات بطريقة كوريوس يفعل ذلك. عن طريق كتابة Unit الملف الرئيسي الخاص بك gitlab حاوية مثل:

[Unit]...Requires=docker.serviceRequires=redis.serviceRequires=mysql.service...[Service]TimeoutStartSec=0ExecStartPre=-/usr/bin/docker kill gitlabExecStartPre=-/usr/bin/docker rm gitlabExecStart=/usr/bin/docker run --name gitlab gitlabExecStop=/usr/bin/docker stop gitlab

أين mysql.serice هو Unit ملف للحاوية الخلية, redis.service رديس واحد, إلخ.

في حال وجد أي شخص هذا مفيدا ، كتبت أ fish قذيفة النصي (يجب أن تكون محمولة بسهولة ل bash) باستخدام docker inspect لبدء جميع تبعيات الحاويات الخاصة بي. هنا هو رمز ، وذلك باستخدام جي كيو لتحليل جسون:

#!/usr/local/bin/fish# Start all containers# Returns all the dependencies of the input + the input, eg. [dep1, dep2, input]function docker_links_lookup    set result (docker inspect $argv[1] | jq ".[0].HostConfig.Links" | pcregrep -o1 "\"/(.*):.*\"")    for x in $result         docker_links_lookup $x        echo $x    endend# Returns all docker containers in the current directory, including their dependenciesfunction all_docker_containers     for dir in */        if test -f "$dir/Dockerfile"            set container_name (echo $dir | sed "s/\///") #remove trailing /            docker_links_lookup $container_name            echo "$container_name"        end    endend# Take all docker containers and dependencies, filter out duplicates without changing the order (the awk command), then start the containers in that orderall_docker_containers | awk '!seen[$0]++' | xargs docker start

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

docker_links_lookup {{container_name}} | awk '!seen[$0]++' | xargs docker start

تحرير:

وظيفة أخرى مفيدة بدأت استخدامها في البرنامج النصي أعلاه هي هذه الوظيفة:

# This starts the docker containers that are passed in, and waits on the ports they exposefunction start_and_wait    for container in $argv        set ports (docker inspect $container | jq ".[0].Config.ExposedPorts | keys" 2>/dev/null | egrep -o "[0-9]+" | xargs)        docker start $container        docker run -e PORTS="$ports" --link $container:wait_for_this n3llyb0y/wait > /dev/null    endend

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

start_and_wait {{container_name}}

أو في حالة استخدام البرنامج النصي أعلاه ، استبدل السطر الأخير بهذا:

start_and_wait (all_docker_containers | awk '!seen[$0]++' | xargs -n 1)

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