डॉकर-कम्पोज़ लगातार डेटा MySQL


156

यदि मैं चलता हूं तो मैं MySQL डेटा प्राप्त करने के लिए प्रतीत नहीं हो सकता $ 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 कंटेनर में डेटा संग्रहीत करता है और इस मैपिंग के कारण डेटा तब भी जारी रहना चाहिए, भले ही कंटेनर नष्ट हो जाएं। और mysqlकंटेनर सिर्फ db में एक क्लाइंट इंटरफ़ेस है और इसकी वजह से स्थानीय निर्देशिका देख सकते हैंvolumes_from: - data

इस उत्तर का प्रयास किया और यह काम नहीं किया। डॉकटर-कम्पोसेज़ पर्सेंटेज डेटा ट्रबल

संपादित करें

मेरी बदली गई .ymlजैसा कि नीचे दिखाया और एक निर्देशिका बनाई ./dataलेकिन अब जब मैं चलाने कह त्रुटि फेंकता कंटेनर अभ्यस्त शुरूdocker-compose up --buildmysql

  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

डेटा कंटेनर एक उत्कृष्ट प्रभाव है। डेटा-वॉल्यूम आपके लिए ट्रिक करेगा। इसके 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
MySQL 5.7.6 के साथ शुरू (फिर से) डॉकर छवि के साथ अनुमति की समस्या होगीmysql । आप इसके बजाय mariadbडॉकर छवि का उपयोग कर सकते हैं , जो डॉकर संस्करणों के साथ त्रुटिपूर्ण काम करता है
पीटरिनो

इस समाधान ने मेरे लिए काम किया। साइड नोट्स / पूर्वसूचनाओं के एक जोड़े: 1. जब आप डॉक-कंपोज़.आईआईएमएल में उपरोक्त कॉन्फ़िगरेशन का उपयोग करते हैं और आप "डॉक स्टैक तैनाती -सी डोज़-कम्पोज़.माइल मिस्टैक" का उपयोग करके अपनी सेवा स्टैक को तैनात करते हैं, तो बनाने की कोई आवश्यकता नहीं है। वॉल्यूम मैन्युअल रूप से, यह आपके लिए स्वचालित रूप से / var / lib / docker / संस्करणों / mysteryack_my-datavolume के रूप में बनाया जाएगा (ध्यान दें कि यह "nameack_" वॉल्यूम नाम के लिए प्रस्तुत करता है)। 2. मुझे अपनी निर्देशिका की अनुमति नहीं बदलनी थी। यहां तक ​​कि अगर मेरे पास mysql: root में मेरे कंटेनर के स्वामित्व वाली फाइलें हैं, तो उन्हें बिना मुद्दों के मेरे Docker होस्ट पर 27: रूट के रूप में बनाया गया था।
जॉय कोटे

10
आप var/lib/docker/volumesअपने प्रोजेक्ट फ़ोल्डर में डायरेक्टरी जैसे होने के बजाय इसे कभी क्यों स्टोर करना चाहते हैं data/mysql?
द गॉडफादर

@ TheGodfather मेरा अनुमान है कि यदि आप अपने उत्पादन मशीन में MySQL डेटा को तैनात नहीं करना चाहते हैं; अन्यथा, यह सब कुछ एक साथ रखने वाला एक बहुत ही अच्छा विचार है।
डंकन

1
@ मुझे लगता है कि क्योंकि मैं अपने आप को और अधिक आश्वस्त महसूस करता हूं जब मेरे ऐप और डेटा के सभी हिस्सों को किसी तरह एक साथ संग्रहीत किया जाता है, और मुझे कहीं से कुछ मात्रा पर कोई निर्भरता नहीं है
गॉडफादर

53

3 तरीके हैं:

पहला तरीका

आपको अपने होस्ट मशीन पर mysql डेटा संग्रहीत करने के लिए निर्देशिका निर्दिष्ट करने की आवश्यकता है । फिर आप डेटा कंटेनर को निकाल सकते हैं। आपका mysql डेटा आपको स्थानीय फाइल सिस्टम पर सहेजा जाएगा।

Mysql कंटेनर परिभाषा इस तरह दिखना चाहिए:

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और यदि आप w / कॉलन निर्दिष्ट नहीं करते हैं तो यह उसी dir को मैप करता है?
एडम

नहीं। दुर्भाग्य से इस मामले में डॉकटर इस कंटेनर निर्देशिका को यादृच्छिक होस्ट फ़ोल्डर में मैप करते हैं जैसे/var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
बुखारोव सर्गेई

ठीक है, मैं सोचा volumes: - /var/lib/mysqlके बराबर थाvolumes: - /var/lib/mysql:/var/lib/mysql
एडम

आपका रोमांचकारी तरीका काम नहीं करेगा क्योंकि डॉकटर वॉल्यूम से इमेज तक के डेटा को कमिट नहीं करता है। देखें github.com/moby/moby/issues/6999
ओहमेन

13

आपको mysql डेटा के लिए एक अलग वॉल्यूम बनाना होगा।

तो यह इस तरह दिखेगा:

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

और नहीं, /var/lib/mysqlअपने mysql कंटेनर के अंदर एक रास्ता है और आपके मेजबान मशीन पर एक पथ के साथ कुछ नहीं करना है। आपकी मेजबान मशीन में भी कोई mysql नहीं हो सकता है। तो लक्ष्य एक mysql कंटेनर से एक आंतरिक फ़ोल्डर को बनाए रखना है।


नहीं यह मेरा बदलते से अलग नहीं होगा volumesकरने के लिए डेटा कंटेनर के नीचे क्या आप अपने नीचे रखा volumesऔर केवल था volumes_from: - dataके लिए mysql? यह भी और एक नई त्रुटि का प्रयास किया। कहते हैं कि डायर मौजूद है, लेकिन लिखने योग्य नहीं और mysqlकंटेनर नहीं चलेगा।
एडम

बेशक आपको एक पथ के साथ एक स्थानीय फ़ोल्डर बनाना होगा ।/mysql-data (या जो भी आप अर्धविराम से पहले
डालेंगे

मेरा संपादन देखें। टिप्पणी करने से पहले इसे प्राप्त न करें। लेकिन स्थानीय dir बनाया। लगता है कि अभी अनुमति का मुद्दा है।
एडम

त्रुटि: सेवा "mysql" "डेटा" से वॉल्यूम की गणना करता है, जो किसी सेवा या कंटेनर का नाम नहीं है।
मैसिमिलियानो अरियोन

10

वास्तव में यह रास्ता है और आपको काम करने के लिए एक वैध रास्ते का उल्लेख करना चाहिए। यदि आपका डेटा निर्देशिका वर्तमान निर्देशिका में है, तो इसके बजाय my-dataआपको उल्लेख करना चाहिए ./my-data, अन्यथा यह आपको mysqlऔर उस त्रुटि को mariadbभी देगा।

volumes:
 ./my-data:/var/lib/mysql
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.