মাইএসকিউএল সেট আপ এবং ডকফাইফিলের মধ্যে ডাম্প আমদানি


127

আমি আমার ল্যাম্প প্রকল্পের জন্য একটি ডকস্পাইল সেটআপ করার চেষ্টা করছি, তবে মাইএসকিউএল শুরু করার সময় আমার কিছু সমস্যা হচ্ছে। আমার ডকফাইফিলের উপর আমার ভাসমান রেখা রয়েছে:

VOLUME ["/etc/mysql", "/var/lib/mysql"]
ADD dump.sql /tmp/dump.sql
RUN /usr/bin/mysqld_safe & sleep 5s
RUN mysql -u root -e "CREATE DATABASE mydb"
RUN mysql -u root mydb < /tmp/dump.sql

তবে আমি এই ত্রুটিটি পেতে থাকি:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)

ডকফাইফিল বিল্ড চলাকালীন কীভাবে ডাটাবেস তৈরি এবং আমদানি সেটআপ করবেন সে সম্পর্কে কোনও ধারণা?


এটি প্রতিটি RUNকমান্ড একটি পৃথক ধারক মধ্যে কার্যকর করা হয় যে কারণে হয় । : এটা ভাল এখানে ব্যাখ্যা করা হয় stackoverflow.com/questions/17891669/...
Kuhess

এটি কেবল ব্যাখ্যা করে যে RUN কমান্ডগুলির বিভিন্ন প্রসঙ্গ রয়েছে। তবে আমি প্রসংগে নয়, একটি ডিমন নির্ভর করছি।
ভিনলিনিক্স

1
হ্যাঁ, তবে আপনি মাইএসকিউএলে কেন সংযোগ করতে পারবেন না তা তা ব্যাখ্যা করে। কারণ এটি, এটি কেবল আপনার প্রথম RUNলাইনে চলছে ।
কুহেস

আপনার এসকিউএল স্টেটমেন্টগুলি কার্যকর করতে আপনার মাইএসকিউএল শুরু করতে হবে এবং একই ধারকটিতে মাইএসকিউএল ক্লায়েন্ট ব্যবহার করতে হবে: RUNএকাধিক পদক্ষেপ সহ with : আপনি এখানে একটি সফটওয়্যারের একটি মাল্টি-পদক্ষেপ ইনস্টলেশন একটি উদাহরণ জানতে পারেন stackoverflow.com/questions/25899912/install-nvm-in-docker/...
Kuhess

উত্তর:


122

এ এর প্রতিটি RUNনির্দেশ Dockerfileএকটি ভিন্ন স্তরে কার্যকর করা হয় (যেমন নথিতেRUN বর্ণিত )।

আপনার মধ্যে Dockerfile, আপনার কাছে তিনটি RUNনির্দেশ রয়েছে। সমস্যাটি হ'ল মাইএসকিউএল সার্ভারটি প্রথম প্রথম শুরু হয়েছিল। অন্যগুলিতে, কোনও মাইএসকিউএল চলছে না, এজন্য আপনি mysqlক্লায়েন্টের সাথে আপনার সংযোগ ত্রুটি পান ।

এই সমস্যাটি সমাধান করার জন্য আপনার কাছে 2 টি সমাধান রয়েছে।

সমাধান 1: একটি লাইন ব্যবহার করুন RUN

RUN /bin/bash -c "/usr/bin/mysqld_safe --skip-grant-tables &" && \
  sleep 5 && \
  mysql -u root -e "CREATE DATABASE mydb" && \
  mysql -u root mydb < /tmp/dump.sql

সমাধান 2: স্ক্রিপ্ট ব্যবহার করুন

একটি এক্সিকিউটেবল স্ক্রিপ্ট তৈরি করুন init_db.sh:

#!/bin/bash
/usr/bin/mysqld_safe --skip-grant-tables &
sleep 5
mysql -u root -e "CREATE DATABASE mydb"
mysql -u root mydb < /tmp/dump.sql

আপনার এই লাইনগুলি যুক্ত করুন Dockerfile:

ADD init_db.sh /tmp/init_db.sh
RUN /tmp/init_db.sh

আপনার কী ধারণা আছে যে আমি কীভাবে সেই তথ্যটি চালিয়ে যেতে পারি? আমি ডকফাইফিল বিল্ডে যে ডেটাবেসগুলি এবং সারণীগুলি তৈরি করছি তা যখন আমি পাত্রে জিনিস চালাই না তখন উপলব্ধ হয় না। :(
ভিনিলিনাক্স

1
এটি অধ্যবসায়ী দ্বারা আপনি কী বোঝাতে চান তার উপর নির্ভর করে। আপনি যদি বেশ কয়েকটি docker runমৃত্যুদন্ড কার্যকর করার জন্য ডেটা বজায় রাখতে চান তবে আপনাকে ভলিউম মাউন্ট করতে হবে। আপনি যদি নিজের ডাম্পের সাথে কেবল একটি ধারক রাখতে চান তবে আপনি আরও পরিবর্তন অবিরত করতে চান না, আপনি VOLUMEআপনার নির্দেশাবলী থেকে মুক্তি পেতে পারেন Dockerfile
কুহেস

16
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)সমাধানটি চেষ্টা করার সময় আমি পাই 1 লগগুলি অনুসরণ করে mysqld_safe Starting mysqld daemon with databases from /var/lib/mysqlএবংmysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
ভিটুইল

1
মাইএসকিএল একটি ডেটাবেস তৈরি করেছে কিনা তা দেখার জন্য আমি প্রারম্ভকালে স্ক্রিপ্ট চেক করা আরও ভাল। যদি এটি থাকে তবে এটি একা রেখে দিন, অন্যথায় mysql_init_dbআপনার ডাটাবেস কাঠামোটি চালান এবং লোড করুন। এটি টেস্ট করার সময় ডাটাবেসটি স্বয়ংক্রিয়ভাবে পুনরায় সেট করার নমনীয়তাটিকে অনুমতি দেয় তবে আপনি যদি এটি বিভিন্ন ডেটা সেট বজায় রাখতে বা পরীক্ষা করতে চান তবে আপনি কেবলমাত্র / var / lib / mysql ব্যবহার করে একটি ভলিউম মাউন্ট করবেন docker run -v ...
মনিকা-ডোর দুহ

1
@ ট্রেভোরগ্রায়সন - এটিও কাজ করে না। এখন এটি ত্রুটিটি দেয় ERROR 2003 (HY000): '127.0.0.1' (111) -তে মাইএসকিউএল সার্ভারের সাথে সংযোগ স্থাপন করতে পারে না
গভীর

166

অফিসিয়াল মাইএসকিএল ডকার চিত্রের সর্বশেষতম সংস্করণ আপনাকে শুরুতে ডেটা আমদানির অনুমতি দেয় to এখানে আমার ডকার-কমপোজ.আইএমএল

data:
  build: docker/data/.
mysql:
  image: mysql
  ports:
    - "3307:3306"
  environment:
    MYSQL_ROOT_PASSWORD: 1234
  volumes:
    - ./docker/data:/docker-entrypoint-initdb.d
  volumes_from:
    - data

এখানে, আমার কাছে আমার ডেটা-ডাম্প.এসকিউএল রয়েছে docker/dataযার অধীনে ডকার-কম্পোজ যে ফোল্ডারটি চলছে সেটির সাথে সম্পর্কিত। আমি সেই ডিরেক্টরিতে এই স্কয়ার ফাইলটি ধারকটিতে স্থাপন করছি /docker-entrypoint-initdb.d

এটি কীভাবে কাজ করে তা যদি আপনি আগ্রহী হন তবে docker-entrypoint.shগিটহাব এ দেখুন । ডেটা আমদানি করার জন্য তারা এই ব্লকটি যুক্ত করেছে

    echo
    for f in /docker-entrypoint-initdb.d/*; do
        case "$f" in
            *.sh)  echo "$0: running $f"; . "$f" ;;
            *.sql) echo "$0: running $f"; "${mysql[@]}" < "$f" && echo ;;
            *)     echo "$0: ignoring $f" ;;
        esac
        echo
    done

একটি অতিরিক্ত নোট, আপনি যদি মাইএসকিএল কনটেইনারটি বন্ধ এবং অপসারণের পরেও ডেটা বজায় রাখতে চান তবে ডকার-কমপোজ.আইএমএল-তে আপনার দেখতে আলাদা ডেটা ধারক থাকা দরকার। ডেটাফোনার ডকফেরফাইলের সামগ্রীগুলি খুব সহজ।

FROM n3ziniuka5/ubuntu-oracle-jdk:14.04-JDK8

VOLUME /var/lib/mysql

CMD ["true"]

অধ্যবসায়ের জন্য ডেটা পাত্রে এমনকি শুরু অবস্থায় থাকতে হবে না।


1
এটিই উত্তম উত্তর আইএমএইচও। এটি নিজের কোনও চিত্র তৈরি করতে দেয় না। এই টিপ জন্য ধন্যবাদ।
ধাতব

5
- ./docker/data:/docker-entrypoint-initdb.dখণ্ডগুলির জন্য একটি ছোটখাটো পরিবর্তন: .ধারক ডিরেক্টরিটির সামনে সরিয়ে নেওয়া।
ডেভিড সিনক্লেয়ার

7
যদিও এটি সঠিক পদ্ধতি এটি ব্যবহারের ক্ষেত্রে খুব ভাল সমাধান করে না। ডকারের একটি সুবিধা হ'ল আপনি খুব দ্রুত পরিবেশ স্পিন করতে পারবেন spin প্রারম্ভকালীন সময়ে ডকার একটি মাইএসকিউএল ডিবি আমদানি করার সময় যদি আপনাকে 3-4 মিনিটের জন্য অপেক্ষা করতে হয় তবে আপনি এই সুবিধাটি হারাবেন। উদ্দেশ্যটি হ'ল এমন একটি ধারক থাকুন যাতে ইতিমধ্যে ডাটাবেজে ডেটা থাকে, যাতে আপনি এটি যত তাড়াতাড়ি ব্যবহার করতে পারেন।
গ্যারেথ ম্যাকডেইড

3
এই উত্তরটি এখনও সর্বশেষতম সংস্করণগুলির সাথে কাজ করছে? আর কাজ করবে বলে মনে হচ্ছে না
ড্যানিয়েল

2
মনে রাখবেন যে এখানে ডকার-রচনা উদাহরণটি v2 নয় v3। "ভলিউম_ফ্রম:" v3 সমর্থন করে না।
আর্নেস্ট

37

আমি যা করেছি তা ছিল আমার "এসবিএল ডাম্প" "ডিবি-ডাম্প" ফোল্ডারে ডাউনলোড করে এবং এটি মাউন্ট করা:

mysql:
 image: mysql:5.6
 environment:
   MYSQL_ROOT_PASSWORD: pass
 ports:
   - 3306:3306
 volumes:
   - ./db-dump:/docker-entrypoint-initdb.d

আমি যখন docker-compose upপ্রথমবারের জন্য দৌড়ব, তখন ডিবিতে ডাম্পটি পুনরুদ্ধার করা হবে।


3
+1, আরও একটি সংযোজন সহ: স্ক্রিপ্টের লিঙ্কটি আসলে কী ঘটছে তা আরও ভালভাবে বোঝার জন্য চালানো হচ্ছে: github.com/docker-library/mariadb/blob/…
টম

6
সর্বশেষতমটি mysqlমনে হয় ডাম্প করা এসকিএল ফাইল লোড করে না, এমনকি 5.6 ব্যবহার করেও আমার ইনোডিবি স্টোরেজ ইঞ্জিনগুলির সাথে সমস্যা রয়েছে।

1
এখানে একই, এটির মতো নির্দেশ রয়েছে এবং আমি এমনকি লগিংয়েও দেখেছি যে থিম ফাইলগুলি লোড হচ্ছে, তবে ডিবি খালি!
হলমস

11

আমি ডকার-এন্ট্রিপয়েন্ট-initdb.d পদ্ধতির ব্যবহার করেছি (@ কুহেসকে ধন্যবাদ) তবে আমার ক্ষেত্রে আমি .env ফাইলে সংজ্ঞায়িত কিছু পরামিতির উপর ভিত্তি করে আমার ডিবি তৈরি করতে চাই তাই আমি এগুলি করেছি

1) প্রথমে .env ফাইলটিকে আমার ডকার রুট প্রকল্প ডিরেক্টরিতে সংজ্ঞায়িত করব

MYSQL_DATABASE=my_db_name
MYSQL_USER=user_test
MYSQL_PASSWORD=test
MYSQL_ROOT_PASSWORD=test
MYSQL_PORT=3306

2) তারপরে আমি আমার ডকার-কমপোজ.আইএমএল ফাইলটি সংজ্ঞায়িত করব। সুতরাং আমি আমার পরিবেশের ভেরিয়েবলগুলি সংজ্ঞায়িত করতে আরগস নির্দেশিকাটি ব্যবহার করেছি এবং আমি তাদের .env ফাইল থেকে সেট করেছি

version: '2'
services:
### MySQL Container
    mysql:
        build:
            context: ./mysql
            args:
                - MYSQL_DATABASE=${MYSQL_DATABASE}
                - MYSQL_USER=${MYSQL_USER}
                - MYSQL_PASSWORD=${MYSQL_PASSWORD}
                - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
        ports:
            - "${MYSQL_PORT}:3306"

3) তারপরে আমি একটি মাইএসকিএল ফোল্ডারটি সংজ্ঞায়িত করি যাতে একটি ডকফেরফাইল অন্তর্ভুক্ত থাকে। সুতরাং ডকফেরাইল এটি

FROM mysql:5.7
RUN chown -R mysql:root /var/lib/mysql/

ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD

ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD

ADD data.sql /etc/mysql/data.sql
RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql
RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d

EXPOSE 3306

4) এখন আমি আমার ডিবি ডাম্প করার জন্য মাইএসকিএলডাম্প ব্যবহার করি এবং মাইএসকিএল ফোল্ডারের ভিতরে ডেটা.এসকিউএল রাখি

mysqldump -h <server name> -u<user> -p <db name> > data.sql

ফাইলটি কেবল একটি সাধারণ স্কয়ার ডাম্প ফাইল তবে আমি শুরুতে 2 টি লাইন যুক্ত করি যাতে ফাইলটি এর মতো দেখায়

--
-- Create a database using `MYSQL_DATABASE` placeholder
--
CREATE DATABASE IF NOT EXISTS `MYSQL_DATABASE`;
USE `MYSQL_DATABASE`;

-- Rest of queries
DROP TABLE IF EXISTS `x`;
CREATE TABLE `x` (..)
LOCK TABLES `x` WRITE;
INSERT INTO `x` VALUES ...;
...
...
...

সুতরাং যা হ'ল তা হ'ল যে আমি "RUN sed -i's / MYSQL_DATABASE / 'Y MYSQL_DATABASE' / g '/etc/mysql/data.sql" কমান্ডটি MYSQL_DATABASEআমার ডিবিতে সেট করে রেখেছি আমার ডিবির নামটি স্থানান্তরিত করতে .env ফাইল।

|- docker-compose.yml
|- .env
|- mysql
     |- Dockerfile
     |- data.sql

এখন আপনি নিজের ধারকটি তৈরি এবং চালানোর জন্য প্রস্তুত


আমি একটি .envফাইল ব্যবহার করার পদ্ধতির পছন্দ করি । তবে অনুযায়ী এই , .envফাইল বৈশিষ্ট্য শুধুমাত্র কাজ করে যখন আপনি ব্যবহার docker-compose upকমান্ড সাথে কাজ করে না docker stack deploy। সুতরাং, যদি আপনি ব্যবহার করতে চান .envউৎপাদনে ফাইল, আপনি চেক আউট করতে চাইতে পারেন Docker গোপন যে সঙ্গে চালু docker 17.06। তারপরে আপনি আপনার .env ফাইলটিকে বিকাশ docker compose upএবং উত্পাদন উভয় docker stack deployপর্যায়েই গোপনীয়তার সাথে ব্যবহার করতে পারেন
ইরা

চমৎকার পন্থা তবে আমি আপনাকে প্রস্তাবিত আদেশের পরিবর্তে RUN sed -i '1s/^/CREATE DATABASE IF NOT EXISTS $ MYSQL_DATABASE ;\nUSE $ MYSQL_DATABASE ব্যবহার করার পরামর্শ দিচ্ছি । এইভাবে আপনি আপনার যে কোনও ডাম্প ফাইল ব্যবহার করতে পারেন - আপনি যদি প্রচুর পরিমাণে ডেটা নিয়ে কাজ করেন তবে এটি কার্যকর :) :);\n/' data.sqlsed
টমাসজ কাপ্পোস্কি

9

এখানে একটি কাজের সংস্করণ ব্যবহার v3করে docker-compose.yml। মূলটি হ'ল ভলিউম নির্দেশিকা:

mysql:
  image: mysql:5.6
  ports:
    - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_USER: theusername
    MYSQL_PASSWORD: thepw
    MYSQL_DATABASE: mydb
  volumes:
    - ./data:/docker-entrypoint-initdb.d

আমার যে ডিরেক্টরিতে আছে তা docker-compose.ymlআমার কাছে একটি dataডির রয়েছে যাতে .sqlডাম্প ফাইল রয়েছে । এটি দুর্দান্ত কারণ আপনার .sqlপ্রতি টেবিলে ডাম্প ফাইল থাকতে পারে ।

আমি কেবল দৌড়াচ্ছি docker-compose upএবং আমি যেতে ভাল। স্টপগুলির মধ্যে ডেটা স্বয়ংক্রিয়ভাবে স্থির থাকে। আপনি ডাটা অপসারণ চান এবং যদি নতুন "স্তন্যপান" .sqlফাইল চালানোর docker-compose downতারপর docker-compose up

কেউ যদি ভলিউম অপসারণ না করে কীভাবে mysqlডকারকে পুনরায় প্রক্রিয়া করতে ফাইলটি পেতে জানে /docker-entrypoint-initdb.d, দয়া করে একটি মন্তব্য দিন এবং আমি এই উত্তরটি আপডেট করব।


2
এই উত্তরটি আমাকে সাহায্য করেছিল। নোটটি docker-compose downখুব গুরুত্বপূর্ণ ছিল কারণ আমি ডকার-রচনা পুনরায় চালু করার পরেও কোনও পরিবর্তন দেখছিলাম না। এমওয়াইএসকিউএল_ডাটাএবস এই ক্ষেত্রে প্রয়োজনীয় পরিবর্তনশীল
nxmohamad
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.