أركض جيتلاب في حاوية عامل الميناء ويفصل تبعياتها (ميسكل ، ريديس ، ميلسيرفر) لطيف جدا في حاويات دوكر منفصلة. تشغيلها ليست مشكلة ، وأبدأ لهم في ترتيب عكسي: التبعيات أولا ، من جيتلاب نفسها.
من وقت لآخر لا بد لي من إعادة تشغيل المضيف عامل الميناء. حاليا أنا سه في المضيف عامل الميناء وإعادة تشغيل الحاويات يدويا. هل هناك طريقة أفضل لذلك? مثل مجرد قول بعض الخدمات لبدء حاوية جيتلاب وأنه يعتني بدء تبعياتها أولا? وأنا أعلم أنني يمكن أن تخلق البرامج النصية إينيت الفردية لكل حاوية عامل الميناء ، ولكن هذا ليس ما أبحث عنه.
في حال وجد أي شخص هذا مفيدا ، كتبت أ 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 وظيفة مثل هذا:
وظيفة أخرى مفيدة بدأت استخدامها في البرنامج النصي أعلاه هي هذه الوظيفة:
# 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}}
أو في حالة استخدام البرنامج النصي أعلاه ، استبدل السطر الأخير بهذا:
سيتأكد هذا السطر الأخير من أن جميع الحاويات لا تبدأ إلا بعد تبعياتها ، بينما تنتظر أيضا التبعيات لإكمال بدء التشغيل فعليا. لاحظ أن هذا ربما لا ينطبق على كل إعداد ، حيث أن بعض الخوادم قد تفتح منافذها على الفور ، دون أن تكون جاهزة بالفعل (على الرغم من أنني لا أعرف أي خوادم تقوم بذلك بالفعل ، ولكن هذا هو السبب الذي يعطيه مطورو عامل الإرساء عند سؤالهم عن ميزة مثل هذه).