स्वचालित रूप से डॉकर कंटेनर की लिंक्ड निर्भरता शुरू करें

मैं दौड़ता हूं gitlab में एक डोकर कंटेनर और यह अपनी निर्भरता (माईएसक्यूएल, रेडिस, मेलसेवर) को अलग-अलग डॉकर कंटेनरों में काफी अच्छी तरह से अलग करता है । उन्हें चलाना कोई समस्या नहीं है, मैं उन्हें उल्टे क्रम में शुरू करता हूं: निर्भरता पहले, गिटलैब की तुलना में ।

समय समय पर मुझे डॉकर होस्ट को पुनरारंभ करना होगा । वर्तमान में मैं डॉकर होस्ट में एसएसएच करता हूं और कंटेनरों को मैन्युअल रूप से पुनरारंभ करता हूं । क्या इसके लिए कोई बेहतर तरीका है? जैसे गिटलैब कंटेनर शुरू करने के लिए कुछ सेवा बताएं और यह पहले अपनी निर्भरता शुरू करने का ख्याल रखता है? मुझे पता है कि मैं प्रत्येक डॉकर कंटेनर के लिए व्यक्तिगत इनिट स्क्रिप्ट बना सकता हूं, लेकिन यह वह नहीं है जो मैं ढूंढ रहा हूं ।

आप 'आधिकारिक'में भी देखना चाह सकते हैं अंजीर परियोजना, जिसे अब बदल दिया गया है डॉकर रचना. इसे कॉन्फ़िगर / सेटअप करना काफी आसान होना चाहिए ।

गिटलैब चलाने का आपका उपयोग मामला मूल रूप से समान है अंजीर - Wordpress उदाहरण या का उपयोग करके gitlab-रचना स्क्रिप्ट

और अगर आप एक मैक पर काम कर रहे हैं, आप पर एक नज़र है चाहता हूँ हो सकता है डोकर toolbox जिसमें रचना शामिल है, लेकिन जल्दी उठने और चलाने के लिए कई अन्य उपकरण भी शामिल हैं!

मैं आप को देख सकते हैं लगता है अलंकार

इसके अलावा आप निर्भरताओं को एक तरह से प्रबंधित कर सकते हैं जो कोरओएस करता है । एक लिखकर 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 फ़ाइल के लिए MySQL कंटेनर, redis.service एक Redis एक, आदि.

यदि किसी को यह उपयोगी लगता है, तो मैंने लिखा है fish शेल स्क्रिप्ट (आसानी से पोर्टेबल होना चाहिए bash) का उपयोग करना docker inspect मेरे कंटेनरों की सभी निर्भरता शुरू करने के लिए । यहाँ कोड है, का उपयोग कर jq पार्स करने के लिए json:

#!/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)

यह अंतिम पंक्ति यह सुनिश्चित करेगी कि सभी कंटेनर केवल उनकी निर्भरता के बाद शुरू किए गए हैं, जबकि निर्भरता के लिए वास्तव में अपने स्टार्टअप को पूरा करने की प्रतीक्षा कर रहे हैं । ध्यान दें कि यह शायद हर सेटअप पर लागू नहीं होता है, क्योंकि कुछ सर्वर अपने पोर्ट को तुरंत खोल सकते हैं, वास्तव में तैयार होने के बिना (हालांकि मैं किसी भी सर्वर को नहीं जानता जो वास्तव में ऐसा करता है, लेकिन यही कारण है कि डॉकर डेवलपर्स पूछते समय देते हैं उन्हें इस तरह की सुविधा के बारे में) ।