2014-12-19 21 views
6

पर डेटा सहेज नहीं रहा है। मैं एक MySQL डॉकर कंटेनर बनाने की कोशिश कर रहा हूं जो एक निश्चित स्कीमा और बीज डेटा के साथ प्रीसेट है ताकि मैं अन्य कंटेनर को डीबी के रूप में कनेक्ट कर सकूं। मैं आधार के रूप में trusted dockerfile/mysql image का उपयोग कर रहा हूं, और मैंने उस आधार से एक नई छवि बनाने के लिए एक डॉकरफ़ाइल लिखा और इसमें मेरी schema.sql जोड़ें। उस छवि (mysql: base) के निर्माण के बाद, मैं नए कंटेनर में बैश चलाने की कोशिश कर रहा हूं, फिर mysql में जाएं और अपना डेटाबेस बनाएं और फिर स्कीमा आयात करें। मैं फिर कंटेनर से बाहर निकलता हूं और कंटेनर को एक नई डॉकर छवि में करने की कोशिश करता हूं। हालांकि, परिणामस्वरूप छवि MySQL डीबी में किए गए किसी भी बदलाव को जारी नहीं रखती है। यह अन्य फाइलों को जारी रखता है जिन्हें मैंने कंटेनर में लिखा था, लेकिन डीबी नहीं।MySQL डॉकर कंटेनर नई छवि

यहां डॉकरफ़ाइल है जिसका उपयोग मैं प्रारंभिक छवि (myorg/mysql: base) बनाने के लिए करता हूं।

FROM dockerfile/mysql:latest 
MAINTAINER (me) 

ADD schema.sql /data/schema.sql 

EXPOSE 3306 

# Define working directory. 
WORKDIR /data 

CMD ["mysqld_safe"] 

कि निर्माण के बाद, मैं छवि में जाना:

docker run -i -t myorg/mysql:base bash 

और MySQL चलाने स्कीमा आयात करने के लिए:

myslqd_safe & 
141218 00:15:56 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql 

mysql -u root 

mysql> CREATE DATABASE mydb; 
exit; 

mysql -u root -D mydb < schema.sql 

मैं mysql में जाने और स्कीमा सत्यापित कर सकते हैं कर दिया गया है आयातित सफलतापूर्वक:

mysql -u root -D mydb -e "SELECT * from tokens;" 

इसके अलावा, अगर मैं /var/lib/mysql में जाता हूं तो मैं देख सकता हूं कि mydb निर्देशिका है जिसमें डीबी से संबंधित .frm फ़ाइलें शामिल हैं।

लेकिन जब मैं बाहर निकलें और एक नई छवि है कि कंटेनर प्रतिबद्ध करने के लिए प्रयास करें:

docker commit -m="import schema.sql" -a="Me" 72c2ff39dd65 myorg/mysql:seed 

और फिर नई छवि में जाने:

docker run -i -t --rm myorg/mysql:seed bash 

डाटाबेस फ़ाइलें नहीं रह गया है/var में हैं/lib/mysql, और mysql -u root -e "SHOW DATABASES" चल रहा है mydb डेटाबेस, केवल डिफ़ॉल्ट mysql, information_schema, और performance_schema dbs दिखाता है। मैंने पाया कि अगर मैंने कंटेनर (echo 'test' > newfile) में एक नया टेक्स्टफाइल बनाया है, तो वह फ़ाइल प्रतिबद्ध छवि में मौजूद होगी, लेकिन डीबी नहीं।

मुझे आश्चर्य है कि इस तथ्य के साथ कुछ करने के लिए क्या है कि विश्वसनीय छवि डॉकरफ़ाइल VOLUME ["/etc/mysql", "/var/lib/mysql"] है इसलिए यह डीबी निर्देशिका को वॉल्यूम के रूप में माउंट करता है। माई डॉकरफाइल में यह आदेश नहीं है, लेकिन मुझे नहीं पता कि यह विरासत में है या नहीं (मैं वास्तव में समझ नहीं पा रहा हूं कि वॉल्यूम कितनी अच्छी तरह से काम करता है यह जानने के लिए कि यह मेरे निर्माण को कैसे प्रभावित कर सकता है)। मुझे वॉल्यूम के रूप में घुड़सवार डीबी की आवश्यकता नहीं है क्योंकि मुझे नेटवर्क कनेक्शन पर कनेक्ट करने के लिए एक और कंटेनर चाहिए (मैं इसके लिए डॉकर लिंक का उपयोग करने जा रहा हूं)।

FWIW, मैं ओएस एक्स 10.9.5 पर boot2docker 1.3.2 चला रहा हूं।

+0

एफवाईआई आधिकारिक MYSQL कंटेनर यहां https://registry.hub.docker.com/_/mysql/ है जिसे आपने –

उत्तर

1

आप शायद अपने स्वयं के mysql रोलिंग से बेहतर हैं। इस तरह वहां कोई आश्चर्य नहीं है, वहां कोई छुपा "जादू" नहीं है।

यदि आप mysql कोर के लिए dockerfile उदाहरण देखते हैं, तो आप/var/lib/mysql के लिए वॉल्यूम घोषणा देख सकते हैं।

Docs on docker volumes.

मात्रा में डेटा

एक डेटा की मात्रा एक या अधिक कंटेनर के भीतर एक विशेष रूप से नामित निर्देशिका कि संघ फाइल सिस्टम लगातार या साझा किए गए डेटा के लिए कई उपयोगी सुविधाओं को उपलब्ध कराने के नजरअंदाज है:

  • डेटा वॉल्यूम्स को कंटेनर के बीच साझा और पुन: उपयोग किया जा सकता है
  • डेटा वॉल्यूम में परिवर्तन ई सीधे बना रहे हैं
  • एक डेटा मात्रा के
  • परिवर्तन जब आप एक छवि
  • वॉल्यूम जारी रहती अद्यतन जब तक कोई कंटेनर उन्हें
+0

से लिंक नहीं किया है, मुझे लगता है कि यह जवाब क्यों नहीं बचा रहा था। मैंने शुरू में अपने स्वयं के mysql कंटेनर को रोल करने की कोशिश की थी लेकिन इसे ठीक से स्थापित और कॉन्फ़िगर करना बहुत मुश्किल था। क्या कोई अन्य प्रीबिल्ट छवि है जो मेरे उद्देश्य के लिए बेहतर हो सकती है? –

+2

प्लस 1 समस्या की पहचान करने के लिए, लेकिन "अपना खुद का रोल करें" के लिए शून्य 1। आपको पहले से ही किए गए काम को दोहराने की जरूरत नहीं है। –

+0

शायद इसकी आवश्यकता नहीं है, लेकिन कम से कम आप इसे स्वामी/समझते हैं। – user2105103

5

का उपयोग एक और जवाब के रूप में शामिल नहीं किया जाएगा और आप ने कहा है की मात्रा के लिए प्रतिबद्ध नहीं किया जा सकता और बाल कंटेनर वास्तव में माता-पिता से वॉल्यूम परिभाषाओं का उत्तराधिकारी करते हैं। इसलिए वॉल्यूम में किए गए किसी भी बदलाव को त्याग दिया जाएगा। मैं mysql डेटाबेस फ़ाइलों जैसे डेटा जोड़ना चाहता हूं हमेशा कई कारणों से वॉल्यूम में होना चाहिए और आपको इसे अपनी छवि में प्रतिबद्ध करने की कोशिश नहीं करनी चाहिए।

  1. यदि आपको कंटेनर माइग्रेट करना है तो कंटेनरों से डेटा निकालने का कोई आसान तरीका नहीं है यदि यह वॉल्यूम में नहीं है।
  2. यदि आप एकाधिक कंटेनर शुरू करना चाहते हैं जो डेटा साझा करते हैं तो आपके पास वॉल्यूम में डेटा होना चाहिए।
  3. यदि आप नई कंटेनर या बंदरगाहों के साथ अपनी कंटेनर परिभाषा को बदलना चाहते हैं तो आपको इसे हटाना और फिर से बनाना होगा। यदि आपके पास कंटेनर में डेटा है तो आप इसे खो देंगे। (इस मामले के उदाहरण के लिए this question देखें।)
  4. यूनियन फ़ाइल सिस्टम सामान्य फ़ाइल सिस्टम से धीमा है जो आपके एप्लिकेशन या डेटाबेस को धीमा कर देगा।

तो इसके बजाय आपको क्या करना चाहिए?

  1. केवल डेटा कंटेनर का उपयोग करें जिसे सेवा कंटेनर के किसी भी उदाहरण से जोड़ा जा सकता है। फिर आप अपने डेटा को सेवा कंटेनर में लाने के लिए वॉल्यूम्स का उपयोग कर सकते हैं।
  2. मेजबान घुड़सवार वॉल्यूम का उपयोग करें ताकि आप कंटेनर को पुनरारंभ कर सकें और उसी स्थान को नए कंटेनर में घुमा सकें।
+0

मैं आपको विशेष रूप से कारण 4 के लिए +1 देता हूं जिसे अक्सर अनदेखा किया जाता है। कभी भी यूनियन फाइल सिस्टम – Thomasleveil

+0

में डेटा डालें, स्पष्ट रूप से डॉकर 1.9.0 और नई वॉल्यूम एपीआई (https://docs.docker.com/engine/reference/commandline/volume_create/) के साथ डेटा को केवल कंटेनर का उपयोग करने की आवश्यकता नहीं है। क्या आप जानते हैं कि यह इस प्रश्न पर लागू हो सकता है? – lloiacono

संबंधित मुद्दे