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