एक तैयार डेटाबेस योजना के साथ एक docker mysql कंटेनर बनाना


17

मैं mysql के शीर्ष पर एक डॉक इमेज बनाना चाहता हूं जिसमें पहले से ही मेरे ऐप के लिए आवश्यक योजना है।

मैंने Dockerfile में लाइनें जोड़ने की कोशिश की जो कि मेरी स्कीम को sql फ़ाइल के रूप में आयात करेगी। मैंने ऐसा ही किया (मेरी डॉकरीफाइल):

FROM mysql

ENV MYSQL_ROOT_PASSWORD="bagabu"
ENV MYSQL_DATABASE="imhere"

ADD imhere.sql /tmp/imhere.sql

RUN "mysql -u root --password="bagabu" imhere < /tmp/imhere.sql"

मेरी समझ में, यह काम नहीं किया क्योंकि mysql docker की छवि में mysql क्लाइंट नहीं है (सर्वोत्तम प्रथाओं राज्य "चीजों को केवल इसलिए नहीं जोड़ते हैं क्योंकि वे अच्छा होगा") () (क्या मैं इस बारे में गलत हूं?)

ऐसा करने का एक अच्छा तरीका क्या हो सकता है? मेरे मन में कुछ बातें थीं, लेकिन वे सब गन्दे काम की तरह लगती हैं।

  1. mysql क्लाइंट स्थापित करें, मुझे इसके साथ क्या करना है, इसे हटा दें / फिर इसे शुद्ध करें।
  2. छवि को mysql क्लाइंट बाइनरी कॉपी करें, मुझे जो करना है वह करें, फिर इसे हटा दें।
  3. एक और sql सर्वर में स्कीमा बनाएँ और सीधे db फ़ाइल को कॉपी करें (यह बहुत ही गन्दा लगता है और मुझे समस्याओं के दूषित पूल की तरह लगता है)

कोई सुझाव? एक तरह से उम्मीद है कि बाद में बनाए रखना आसान होगा और शायद सबसे अच्छी प्रथाओं के अनुरूप हो?


जवाबों:


14

आपको अपनी इनइटी स्क्रिप्ट को एक निर्देशिका में रखा जाना चाहिए, जैसे /docker-entrypoint-initdb.d- MySQL Docker इमेज डॉक्स में "इनिशियलाइज़िंग ए ताज़ा इंस्टेंस" सेक्शन ।


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

वास्तव में, कोई बात नहीं :-) मुझे लगा /docker-entrypoint-initdb.dकि मेजबान में था, लेकिन यह वास्तव में कंटेनर में है। मैंने ADDउस निर्देशिका को कॉपी करने के लिए कमांड को बदल दिया और कमांड को हटा दिया RUN। डॉकर ने छवि का सफलतापूर्वक निर्माण किया और मैंने इसका परीक्षण किया और यह काम करता है।
टॉम क्लिनो

14

मुझे परीक्षण उद्देश्यों के लिए ऐसा करना पड़ा।

यहाँ मैं वास्तविक mySQL / MariaDB छवियाँ dockerhub और बहु ​​मंच निर्माण का लाभ उठाकर किया है:

FROM mariadb:latest as builder

# That file does the DB initialization but also runs mysql daemon, by removing the last line it will only init
RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]

# needed for intialization
ENV MYSQL_ROOT_PASSWORD=root

COPY setup.sql /docker-entrypoint-initdb.d/

# Need to change the datadir to something else that /var/lib/mysql because the parent docker file defines it as a volume.
# https://docs.docker.com/engine/reference/builder/#volume :
#       Changing the volume from within the Dockerfile: If any build steps change the data within the volume after
#       it has been declared, those changes will be discarded.
RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db", "--aria-log-dir-path", "/initialized-db"]

FROM mariadb:latest

COPY --from=builder /initialized-db /var/lib/mysql

पूर्ण कार्य उदाहरण यहाँ: https://github.com/lindycoder/prepopulated-mysql-container-example


2
सबसे अच्छा जवाब मुझे पूरे इंटरनेट पर मिला है, मेरा पोस्टग्रेज के लिए था, इसलिए यह थोड़ा अधिक कठिन था, लेकिन आखिरकार यह काम कर गया। और यह पूरी तरह से काम करता है!
बर्फ २०१०

Mysql (5.7.9) के पुराने संस्करणों में /usr/local/bin/docker-entrypoint.sh नहीं है, बल्कि इसके लिए /entrypoint.sh पर सहानुभूति है, इसके बजाय में entrypoint.sh /। /Usr/local/bin/docker-entrypoint.sh को बदलकर /entrypoint.sh काम करता है और संभवतः "आधुनिक" रिलीज़ के लिए भी काम करना चाहिए।
मार्विन

2

@Martin रॉय को श्रेय

Mysql के लिए काम करने के लिए किए गए मामूली बदलाव ...

सामग्री डॉकफ़िल

FROM mysql:latest as builder

# That file does the DB initialization but also runs mysql daemon, by removing the last line it will only init
RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]

# needed for intialization
ENV MYSQL_ROOT_PASSWORD=root

COPY setup.sql /docker-entrypoint-initdb.d/

# Need to change the datadir to something else that /var/lib/mysql because the parent docker file defines it as a volume.
# https://docs.docker.com/engine/reference/builder/#volume :
#       Changing the volume from within the Dockerfile: If any build steps change the data within the volume after
#       it has been declared, those changes will be discarded.
RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db"]

FROM mysql:latest

COPY --from=builder /initialized-db /var/lib/mysql

सामग्री setup.sql

CREATE DATABASE myexample;

USE myexample;

CREATE TABLE mytable (myfield VARCHAR(20));

INSERT INTO mytable VALUES ('Hello'), ('Dolly');

पूर्ण कार्य उदाहरण यहाँ: https://github.com/iamdvr/prepopulated-mysql-container-example


-1

Ansible जैसा प्रबंधन सॉफ़्टवेयर क्लाइंट को स्थापित करने और पुन: स्थापित करने की आवश्यकता के बिना mysql आयात को आसान बनाने में आपकी सहायता कर सकता है। Ansible में डॉक छवियों और कंटेनरों और mysql डेटाबेस को प्रबंधित करने के लिए महान अंतर्निहित विशेषताएं हैं।


यह दिलचस्प है - मैंने Ansible का उपयोग किया है लेकिन डॉकटर छवियों के लिए इसका उपयोग नहीं किया है। क्या आप कुछ उदाहरण पैट्रिक के साथ अपना जवाब दे सकते हैं?
ग्रेग डबकी

Ansible का एक शानदार डॉक्स पृष्ठ है, आप इस url पर Ansible मॉड्यूल पा सकते हैं: docs.ansible.com/ansible/docker_module.html इस गाइड के मॉड्यूल अध्याय में प्रत्येक पृष्ठ पर कुछ उदाहरण हैं।
पैट्रिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.