मैं आपके कंटेनर में एक एंट्रीपॉइंट-स्क्रिप्ट जोड़ने का सुझाव देता हूं; इस एंट्रीपॉइंट-स्क्रिप्ट में, आप जांच सकते हैं कि क्या डेटाबेस को इनिशियलाइज़ किया गया है, और यदि ऐसा नहीं है, तो आवश्यक चरणों का पालन करें।
जैसा कि आपने अपने प्रश्न में देखा है, सेवाओं/कंटेनरों को शुरू करने के क्रम को हल्के में नहीं लिया जाना चाहिए, इसलिए संभव है कि आपका एप्लिकेशन कंटेनर पहले शुरू हो गया हो डेटाबेस कंटेनर, इसलिए स्क्रिप्ट को इसे ध्यान में रखना चाहिए।
एक उदाहरण के रूप में, आधिकारिक वर्डप्रेस छवि पर एक नज़र डालें, जो इसकी एंट्रीपॉइंट-स्क्रिप्ट में डेटाबेस का एक बार आरंभीकरण करता है। स्क्रिप्ट डेटाबेस से कनेक्ट करने का प्रयास करती है (और यदि डेटाबेस से संपर्क नहीं किया जा सकता (अभी तक) फिर से प्रयास करता है), और जांचता है कि आरंभीकरण की आवश्यकता है या नहीं; https://github.com /docker-library/wordpress/blob/df190dc9c5752fd09317d836bd2bdcd09ee379a5/apache/docker-entrypoint.sh#L146-L171
नोट
मैंने देखा है कि आपने अपना वॉल्यूम संलग्न करने के लिए "केवल-डेटा कंटेनर" बनाया है। docker 1.9 के बाद से, docker के पास वॉल्यूम प्रबंधन है, जिसमें वॉल्यूम का नामकरण भी शामिल है। इस वजह से, अब आपको "केवल-डेटा" कंटेनरों का उपयोग करने की आवश्यकता नहीं है।
आप अपनी कंपोज़ फ़ाइल से डेटा-ओनली कंटेनर को हटा सकते हैं, और कुछ इस तरह दिखने के लिए अपनी मोंगो सेवा को बदल सकते हैं;
mongo:
image: mongo:latest
volumes:
- mongodata:/data/db
ports:
- "28001:27017"
command: --smallfiles --rest --auth
इसे mongodata
. नाम से एक नया वॉल्यूम बनाना चाहिए यदि यह मौजूद नहीं है, या उस नाम के साथ मौजूदा वॉल्यूम का पुन:उपयोग करें। आप docker volume ls
. का उपयोग करके सभी संस्करणों को सूचीबद्ध कर सकते हैं और docker volume rm <some-volume>
. के साथ एक वॉल्यूम निकालें अगर अब आपको इसकी आवश्यकता नहीं है