ডকার-রচনা স্থির ডেটা মাইএসকিউএল


156

আমি $ docker-compose downনিম্নলিখিতগুলি দিয়ে চালিত হলে আমার মাইএসকিউএল ডেটা অবিরত থাকতে পারে বলে মনে হচ্ছে না.yml

version: '2'
services:
  # other services

  data:
    container_name: flask_data
    image: mysql:latest
    volumes:
      - /var/lib/mysql
    command: "true"

  mysql:
    container_name: flask_mysql
    restart: always
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
      MYSQL_USER: 'test'
      MYSQL_PASS: 'pass'
    volumes_from:
      - data
    ports:
      - "3306:3306"

আমার বোধগম্যতা হল আমার dataপাত্রে volumes: - /var/lib/mysqlএটি আমার স্থানীয় মেশিন ডিরেক্টরিতে মানচিত্র ব্যবহার করে যেখানে মাইএসকিএল কনটেইনারটিতে ডেটা সঞ্চয় করে এবং এই ম্যাপিংয়ের কারণে পাত্রে ধ্বংস হওয়া সত্ত্বেও ডেটা অবিরত থাকা উচিত। এবং mysqlধারকটি ডিবিতে কেবলমাত্র একটি ক্লায়েন্ট ইন্টারফেস এবং এর কারণে স্থানীয় ডিরেক্টরিটি দেখতে পারেvolumes_from: - data

এই উত্তরটির চেষ্টা করেও এটি কার্যকর হয়নি। ডকার-রচনা স্থির ডেটা সমস্যা

সম্পাদনা

আমার .ymlনীচে প্রদর্শিত হিসাবে পরিবর্তিত এবং একটি dir তৈরি ./dataকিন্তু এখন আমি যখন ধারক চালাতে চাই docker-compose up --buildনা mysqlত্রুটি বলতে ছোঁড়া

  data:
    container_name: flask_data
    image: mysql:latest
    volumes:
      - ./data:/var/lib/mysql
    command: "true"

  mysql:
    container_name: flask_mysql
    restart: always
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
      MYSQL_USER: 'test'
      MYSQL_PASS: 'pass'
    volumes_from:
      - data
    ports:
      - "3306:3306"


flask_mysql | mysqld: Can't create/write to file '/var/lib/mysql/is_writable' (Errcode: 13 - Permission denied)
flask_mysql | 2016-08-26T22:29:21.182144Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
flask_mysql | 2016-08-26T22:29:21.185392Z 0 [ERROR] --initialize specified but the data directory exists and is not writable. Aborting.

উত্তর:


223

ডেটা পাত্রে একটি অতিরিক্ত কাজকর্ম হয় ar ডেটা-ভলিউম আপনার জন্য কৌশলটি করবে। এতে আপনার পরিবর্তন করুন docker-compose.yml:

version: '2'
services:
  mysql:
    container_name: flask_mysql
    restart: always
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
      MYSQL_USER: 'test'
      MYSQL_PASS: 'pass'
    volumes:
      - my-datavolume:/var/lib/mysql
volumes:
  my-datavolume:

ডকার /var/lib/docker/volumesফোল্ডারে আপনার জন্য ভলিউম তৈরি করবে । আপনি যতক্ষণ টাইপ করছেন না ততক্ষণ এই ভলিউমটি বহাল থাকবেdocker-compose down -v


18
মাইএসকিউএল 5.7.6 দিয়ে শুরু করার সাথে ডকার চিত্রের সাথে আবার (আবার) অনুমতি সমস্যা হবে mysql। পরিবর্তে আপনি mariadbডকার চিত্রটি ব্যবহার করতে পারেন , যা ডকার ভলিউমের সাথে নির্বিঘ্নে কাজ করে
পিটারিনো

এই সমাধানটি আমার পক্ষে কাজ করেছিল। দু'পক্ষের নোট / নির্ভুলতা: ১. আপনি যখন উপরোক্ত কনফিগারেশনটি ডকার-কমপোজ.আইএমএল এ ব্যবহার করেন এবং আপনি "ডকার স্ট্যাক ডিপ্লয়-সি ডকার-কমপোজ.আইএমএল মাইস্ট্যাক" ব্যবহার করে আপনার পরিষেবা স্ট্যাক স্থাপন করেন, তখন এটি তৈরি করার দরকার নেই ভলিউম ম্যানুয়ালি, এটি আপনার জন্য স্বয়ংক্রিয়ভাবে / var / lib / ডকার / ভলিউম / মাইস্ট্যাক_মি-ডেটাভলিউম হিসাবে তৈরি করা হবে (লক্ষ্য করুন এটি ভলিউমের নামের সাথে "মাইস্ট্যাক_" প্রিপেন্ড করে)। ২. আমার ডিরেক্টরিতে আমার অনুমতি পরিবর্তন করতে হবে না। যদিও আমার কাছে আমার পাত্রে মাইএসকিএল: মূলের মালিকানাধীন ফাইল রয়েছে, সেগুলি 27 হিসাবে তৈরি হয়েছিল: কোনও সমস্যা ছাড়াই আমার ডকার হোস্টে রুট।
জয়ে কোট

10
var/lib/docker/volumesআপনার প্রকল্প ফোল্ডারের মতো ডিরেক্টরি থাকার পরিবর্তে আপনি কেন এটি সঞ্চয় করতে চান data/mysql?
গডফাদার

@ দ্য গডফাদার আমার অনুমানটি হ'ল আপনি যদি নিজের প্রোডাকশন মেশিনে মাইএসকিউএল ডেটা স্থাপন করতে না চান; অন্যথায়, এটি খুব দৃ idea় ধারণা যা সবকিছু একসাথে রাখে।
ডানকান

1
@ লুও আমি মনে করি কারণ আমার অ্যাপ্লিকেশন এবং ডেটাগুলির সমস্ত অংশ একসাথে সংরক্ষণ করা হলে আমি নিজেকে আরও আত্মবিশ্বাসী বোধ করি এবং কোথাও থেকে কিছু পরিমাণে আমার কোনও নির্ভরতা নেই
দ্য গডফাদার

53

এখানে 3 টি উপায় রয়েছে:

প্রথম উপায়

আপনার হোস্ট মেশিনে মাইএসকিএল ডেটা সঞ্চয় করার জন্য আপনাকে ডিরেক্টরিটি নির্দিষ্ট করতে হবে । এরপরে আপনি ডেটা ধারকটি সরাতে পারেন। আপনার মাইএসকিএল ডেটা আপনার স্থানীয় ফাইল সিস্টেমে সংরক্ষণ করা হবে।

মাইকিউএল কনটেইনার সংজ্ঞা অবশ্যই দেখতে হবে:

mysql:
  container_name: flask_mysql
  restart: always
  image: mysql:latest
  environment:
    MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
    MYSQL_USER: 'test'
    MYSQL_PASS: 'pass'
volumes:
 - /opt/mysql_data:/var/lib/mysql
ports:
  - "3306:3306"

দ্বিতীয় উপায়

টাইপ করার আগে ডেটা ধারক প্রতিশ্রুতিবদ্ধ হতে হবে docker-compose down:

docker commit my_data_container
docker-compose down

তৃতীয় উপায়

এছাড়াও আপনি docker-compose stopপরিবর্তে ব্যবহার করতে পারেন docker-compose down(তারপরে আপনার ধারকটি কমিট করার দরকার নেই)


আমি কেবল volumes: - /var/lib/mysqlএটির কারণেই থাকতে পারি না কারণ এটি মানচিত্র করে HOST:CONTAINERএবং যদি আপনি ডাব্লু / কোলন নির্দিষ্ট না করেন তবে এটি একই ডিয়ারকে মানচিত্র করে?
আদম

না. দুর্ভাগ্যক্রমে এই ক্ষেত্রে ডকার এই কনটেইনার ডিরেক্টরিটি এলোমেলো হোস্ট ফোল্ডারে মানচিত্রের মতো/var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
বুখারভ সের্গেই

ঠিক আছে আমি volumes: - /var/lib/mysqlসমতুল্য বলে মনে করেছিvolumes: - /var/lib/mysql:/var/lib/mysql
অ্যাডাম

আপনার রোমাঞ্চকর উপায়ে কাজ করবে না কারণ ডকার ভলিউম থেকে চিত্রে ডেটা দেয় না। দেখতে github.com/moby/moby/issues/6999
Ohmen

13

মাইএসকিএল ডেটার জন্য আপনাকে একটি পৃথক ভলিউম তৈরি করতে হবে।

সুতরাং এটি এর মতো দেখাবে:

volumes_from:
  - data
volumes:
  - ./mysql-data:/var/lib/mysql

এবং না, /var/lib/mysqlএটি আপনার মাইএসকিএল ধারকটির ভিতরে একটি পাথ এবং এটি আপনার হোস্ট মেশিনে পাথের কোনও সম্পর্ক নেই। আপনার হোস্ট মেশিনে এমনকি কোনও মাইএসকিএল নাও থাকতে পারে। সুতরাং লক্ষ্যটি কোনও মাইএসকিএল ধারক থেকে অভ্যন্তরীণ ফোল্ডারটি ধরে রাখা।


না এটা আমার পরিবর্তন চেয়ে ভিন্ন কোন হতে হবে volumesতথ্য ধারক অধীনে আপনি আপনার অধীন করা volumesকেবল ছিল volumes_from: - dataজন্য mysql? এটি চেষ্টা করেও নতুন ত্রুটি হয়েছে। বলছেন দির বিদ্যমান তবে লিখনযোগ্য নয় এবং ধারকটি mysqlচলবে না।
আদম

অবশ্যই আপনি একটি পাথ ./mysql-data সঙ্গে একটি স্থানীয় ফোল্ডার তৈরি করতে হবে (বা যতটুকু আপনি সেমিকোলন আগে করা হবে)
দিমিত্রি Malyshenko

আমার সম্পাদনা দেখুন। আপনি মন্তব্য করার আগে এটি পেলেন না। কিন্তু স্থানীয় দির তৈরি করেছেন। দেখে মনে হচ্ছে এখন কোনও অনুমতির সমস্যা রয়েছে।
আদম

ত্রুটি: পরিষেবা "মাইএসকিএল" "ডেটা" থেকে ভলিউমগুলি মাউন্ট করে, যা কোনও পরিষেবা বা ধারকটির নাম নয়।
ম্যাসিমিলিয়ানো আরিওনি

10

আসলে এটিই সেই পথ এবং এটির কাজের জন্য আপনার একটি বৈধ পথের উল্লেখ করা উচিত mention আপনার ডেটা ডিরেক্টরি যদি বর্তমান ডিরেক্টরিতে থাকে তবে তার পরিবর্তে my-dataআপনার উল্লেখ করা উচিত ./my-data, অন্যথায় এটি আপনাকে ত্রুটিটি দেয় mysqlএবং mariadbতাও।

volumes:
 ./my-data:/var/lib/mysql
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.