প্রস্তুত ডাটাবেস স্কিম সহ একটি ডকার মাইএসকিএল ধারক তৈরি করা


17

আমি মাইএসকিএল এর উপরে একটি ডকার ইমেজ তৈরি করতে চাই যাতে ইতিমধ্যে আমার অ্যাপ্লিকেশনটির জন্য প্রয়োজনীয় স্কিম রয়েছে।

আমি ডকফাইফায়লে লাইনগুলি যুক্ত করার চেষ্টা করেছি যা স্কিল ফাইল হিসাবে আমার স্কিমটি আমদানি করবে। আমি এটি (আমার ডকফেরফিল) হিসাবে এটি করেছি:

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"

আমার বোঝার জন্য, এটি কার্যকর হয়নি কারণ মাইএসকিএল ডকার ইমেজটিতে কোনও মাইএসকিএল ক্লায়েন্ট থাকে না (সেরা অনুশীলনগুলির বিবরণে "জিনিসগুলি কেবল যুক্তিযুক্ত না কারণ তারা ভাল হবে") (আমি কি এ সম্পর্কে ভুল?)

এটি করার একটি ভাল উপায় কি হতে পারে? আমি কিছু জিনিস মনে মনে রেখেছি, তবে এগুলি সমস্তই অগোছালো কাজের মতো মনে হচ্ছে।

  1. মাইএসকিএল ক্লায়েন্ট ইনস্টল করুন, এর সাথে আমার যা করতে হবে তা করুন, তারপরে এটি মুছে ফেলুন / শুদ্ধ করুন।
  2. ছবিতে মাইএসকিএল ক্লায়েন্ট বাইনারি অনুলিপি করুন, আমার যা করতে হবে তা করুন, তারপরে এটি সরান।
  3. অন্য স্কিএল সার্ভারে স্কিমা তৈরি করুন এবং তাদের সরাসরি ডিবি ফাইলটি অনুলিপি করুন (এটি খুব অগোছালো বলে মনে হচ্ছে এবং সমস্যাগুলির দূষিত পুলের মতো মনে হচ্ছে)

কোনও পরামর্শ? আশা করি এমন কোনও উপায়ে যা পরবর্তী সময়ে বজায় রাখা সহজ হবে এবং সম্ভবত সেরা অভ্যাসের সাথেও সামঞ্জস্য রয়েছে?


উত্তর:


14

মাউন্ট করা ডিরেক্টরিতে আপনার নিজের স্ক্রিপ্টটি রাখা উচিত /docker-entrypoint-initdb.d- মাইএসকিউএল ডকার চিত্র নথিতে "একটি নতুন উদাহরণ শুরু করা" বিভাগটি দেখুন ।


2
এটি আমার স্কিমা দিয়ে একটি তাজা ধারক আনতে এবং এটিকে লোড করার জন্য কাজ করে। এটির চারপাশে একটি দুর্দান্ত উপায়, তবে যদি আমি নিজের ডকার চিত্রটি তৈরি করার কোনও উপায় খুঁজছি যা ইতিমধ্যে স্কিমাটি পূর্বেই ইনস্টল করা আছে?
টম ক্লিনো

আসলে, কিছুই নয় :-) আমি ভেবেছিলাম হোস্টটিতে /docker-entrypoint-initdb.dছিল কিন্তু এটি আসলে ধারক মধ্যে। আমি ADDসেই ডিরেক্টরিতে অনুলিপি করতে আদেশটি পরিবর্তন করেছি এবং RUNআদেশটি সরিয়ে ফেলেছি । ডকার চিত্রটি সফলভাবে তৈরি করেছেন এবং আমি এটি পরীক্ষা করেছি এবং এটি কাজ করে।
টম ক্লিনো

14

পরীক্ষার প্রয়োজনে আমাকে এটি করতে হয়েছিল।

ডকারহাব এবং মাল্টি-স্টেজ বিল্ডে আসল মাইএসকিউএল / মারিয়াডিবি চিত্রগুলি ব্যবহার করে এখানে কী করেছি:

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
সেরা উত্তর আমি পুরো ইন্টারনেটে খুঁজে পেয়েছি, আমার পোস্টগ্রিজের জন্য ছিল, তাই এটি কিছুটা বেশি কঠিন ছিল, তবে অবশেষে এটি কাজ করে। এবং এটি পুরোপুরি কাজ করে!
snowe2010

মাইএসকিএল (৫. versions.৯) এর পুরানো সংস্করণগুলিতে /usr/local/bin/docker-entryPoint.sh টি /entryPoint.sh- তে সিমিলিং করা নেই, পরিবর্তে কেবল / এ প্রবেশপরি.টি.এস.এস. /Usr/local/bin/docker-entryPoint.sh কে /entryPoint.sh এ পরিবর্তন করা কাজ করে এবং সম্ভবত "আধুনিক" প্রকাশের জন্যও কাজ করা উচিত।
মার্ভিন

2

@ মার্টিন রায়কে কৃতিত্ব

মাইএসকিএল-এর জন্য কাজ করতে ছোটখাটো পরিবর্তন করা হয়েছে ...

কন্টেন্ট ডকফাইফাইল

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

সামগ্রী সেটআপ.এসকিউএল

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

উত্তরযোগ্য মত পরিচালন সফ্টওয়্যার আপনাকে ক্লায়েন্ট ইনস্টল এবং পুনরায় ইনস্টল করার প্রয়োজন ছাড়াই সহজেই কোনও মাইএসকিএল আমদানি স্বয়ংক্রিয় করতে সহায়তা করতে পারে। জবাবের ডকার চিত্র এবং পাত্রে এবং মাইএসকিএল ডেটাবেসগুলি পরিচালনা করতে দুর্দান্ত বিল্ট-ইন বৈশিষ্ট্য রয়েছে।


এটি আকর্ষণীয় - আমি উত্তর ব্যবহার করেছি তবে ডকার চিত্রগুলির জন্য এটি ব্যবহার করি নি। আপনি কিছু উত্তর দিয়ে উত্তর উত্তর প্রসারিত করতে পারেন, প্যাট্রিক?
গ্রেগ ডুবিকি

জবাবদিহীর একটি দুর্দান্ত ডক্স পৃষ্ঠা রয়েছে, আপনি এই url- তে উত্তরযোগ্য মডিউলটি খুঁজে পেতে পারেন: ডকস.স্যান্সিবলস / সাবলীল / ডকার_মডিউইল html এই গাইডের মডিউল অধ্যায়ে প্রতিটি পৃষ্ঠায় কয়েকটি উদাহরণ রয়েছে।
প্যাট্রিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.