কীভাবে ডকারাইজড পোস্টগ্রিজ ডাটাবেসে ভলিউম ব্যবহার করে ডেটা স্থির রাখতে হয়


204

আমার ডকার কম্পোজ ফাইলটিতে তিনটি ধারক, ওয়েব, এনজিনেক্স এবং পোস্টগ্র্রেস রয়েছে। পোস্টগ্র্রেসগুলি এর মতো দেখাচ্ছে:

postgres:
  container_name: postgres
  restart: always
  image: postgres:latest
  volumes:
    - ./database:/var/lib/postgresql
  ports:
    - "5432:5432

আমার লক্ষ্য একটি ভলিউম যা একটি স্থানীয় নামক ফোল্ডারের অনুরূপ মাউন্ট করে ./databaseযেমন postgres ধারক ভিতরে /var/lib/postgres। আমি যখন এই ধারকগুলি শুরু করি এবং পোস্টগ্রাগুলিতে ডেটা sertোকান তখন আমি যাচাই করি যে /var/lib/postgres/data/base/আমি যোগ করছি (পোস্টগ্রিস পাত্রে) যে তথ্যটি পূর্ণ হয় তবে আমার স্থানীয় সিস্টেমে ./databaseকেবল এতে একটি dataফোল্ডার পাওয়া যায়, অর্থাৎ ./database/dataএটি তৈরি করা হয় তবে এটি খালি থাকে empty । কেন?

মন্তব্য:

আপডেট 1

নিকের পরামর্শ অনুসারে, আমি এটি করেছি docker inspectএবং পেয়েছি:

    "Mounts": [
        {
            "Source": "/Users/alex/Documents/MyApp/database",
            "Destination": "/var/lib/postgresql",
            "Mode": "rw",
            "RW": true,
            "Propagation": "rprivate"
        },
        {
            "Name": "e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35",
            "Source": "/var/lib/docker/volumes/e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35/_data",
            "Destination": "/var/lib/postgresql/data",
            "Driver": "local",
            "Mode": "",
            "RW": true,
            "Propagation": ""
        }
    ],

যা দেখে মনে হয় যে ডেটাটি অন্য ভলিউমের দ্বারা চুরি হচ্ছে যা আমি নিজের কোড করি নি। কেন তা নিশ্চিত নয়। পোস্টগ্রিসের চিত্রটি কি আমার জন্য সেই ভলিউম তৈরি করছে? যদি তাই হয়, আমি পুনরায় চালু করার সময় আমি যে ভলিউমটি মাউন্ট করছি তার পরিবর্তে সেই ভলিউমটি ব্যবহার করার কোনও উপায় আছে ? অন্যথায়, অন্য ভলিউমটি অক্ষম করার এবং আমার নিজের ব্যবহার করার কি কোনও ভাল উপায় আছে ./database?

আপডেট 2

আমি সমাধানটি পেয়েছি, নিককে ধন্যবাদ! (এবং অন্য বন্ধু) নীচে উত্তর দিন।


আপনি কি ইতিমধ্যে initdbআপনার ডাটাবেস ক্লাস্টার শুরু করতে কমান্ড লাইনটি চালাচ্ছেন ?
সেবাস্তিয়ান ওয়েবার 15

আপনি কি নিশ্চিত যে আপনার ডেটা উপ-ডিরেক্টরি সত্যই খালি? এটিতে বিশেষ অ্যাক্সেসের অনুমতি থাকতে পারে।
ইয়ারোস্লাভ স্টাভিনিচিয়

এত তাড়াতাড়ি আমার কাছে ফিরে আসার জন্য ধন্যবাদ! আমি একটি বোতল অ্যাপ্লিকেশন ব্যবহার করছি, তাই আমি from app import dbএবং db.create_all()A থেকে docker runপাত্রে শুরু করেন। আমি initdbকমান্ড লাইন থেকে সরাসরি না ।
অ্যালেক্স লেনাইল

1
@YaroslavStavnichiy করে আর কী চেক করার জন্য যে চেয়ে জানি না sudo su -এবং বর্ণন ./database/data। যতদূর আমি বলতে পারি সেখানে কিছুই নেই।
অ্যালেক্স লেনাইল

Postgres, ইলাস্টিক অনুসন্ধান এবং মিডিয়া ডেটা অমীমাংসিত সমস্যা নমুনা রচনা ফাইল,: কেউ এই দরকারী হতে পারে stackoverflow.com/a/56475980/5180118
ArdentLearner

উত্তর:


251

আশ্চর্যজনকভাবে যথেষ্ট, সমাধানটি পরিবর্তন হওয়া পর্যন্ত শেষ হয়েছিল

volumes:
  - ./postgres-data:/var/lib/postgresql

প্রতি

volumes:
  - ./postgres-data:/var/lib/postgresql/data

45
এই উত্তরের (যা কাজ করে) কেবল একটি দ্রুত "কেন"। /var/lib/postgresql/dataপোস্টগ্রস ভাবারের জন্য, ডিফল্ট ডেটা ডিরেক্টরিটি হ'ল - আপনি এখানে পিজিডিটিএ ভেরিয়েবল নোটগুলি পড়তে পারেন: store.docker.com/images/…
ম্যাট পাভেল

2
উপরের প্রশ্নে ওপি বলেছে এটি শেষ পর্যন্ত / ডেটা ছাড়াই তার পক্ষে কাজ করেছিল। এটা কি ঠিক?
সিড

2
এবং আপনার .dockerignoreফাইলে স্থানীয় ডিরেক্টরি যুক্ত করুন, বিশেষত যদি আপনি এটিকে কোনও উত্পাদন চিত্রে কাটাবেন। একটি আলোচনার জন্য কোডফ্রেশ.আইও / ব্লগ / নট-ignore-dockerignore দেখুন ।
ডিএসজি

4
এটি এখনও আমার পক্ষে কাজ করে না (ম্যাক ওএস এক্স হাই সিয়েরা)
ওলিডেম

1
@ অলিডি-মেটজ docker rm my_postgres_container_1কাজ করার আগে আমাকে একটি কাজ করতে হয়েছিল (উচ্চ সিয়েরাও)।
সমৃদ্ধ

100

আপনি সমস্ত পোস্টগ্রিজ ডেটার জন্য একটি সাধারণ ভলিউম তৈরি করতে পারেন

 docker volume create pgdata

অথবা আপনি এটি রচনা ফাইলটিতে সেট করতে পারেন

   version: "3"
   services:
     db:
       image: postgres
       environment:
         - POSTGRES_USER=postgres
         - POSTGRES_PASSWORD=postgress
         - POSTGRES_DB=postgres
       ports:
         - "5433:5432"
       volumes:
         - pgdata:/var/lib/postgresql/data
       networks:
         - suruse
   volumes: 
     pgdata:

এটি ভলিউম নাম pgdata তৈরি করবে এবং ধারকটির পথে এই ভলিউমটিকে মাউন্ট করবে।

আপনি এই ভলিউমটি পরিদর্শন করতে পারেন

docker volume inspect pgdata

// output will be
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/pgdata/_data",
        "Name": "pgdata",
        "Options": {},
        "Scope": "local"
    }
]

8
কিছুটা দেরি করে মন্তব্য করা, তবে আমি যদি এটি করি তবে এই পরিষ্কার ডেটা হবে না docker-compose down -v। এবং এর সমাধান কী?
সিড

3
@ সিড, হ্যাঁ, এটি হবে! এই বিকল্পটি সম্পর্কে কেবল সতর্কতা অবলম্বন করুন।
অলিডেম

1
সুতরাং ডকার-কমপোজ দিয়ে [ডাউন] ভলিউমটি কি আর স্থির থাকে না? ভলিউম এমনকি সম্পূর্ণ পরিচ্ছন্নতা আছে?
পল

2
এমনকি পরে মন্তব্য করতে @Sid, কিন্তু আপনি করতে পারেন ব্যবহার docker-compose down --rmi all ছাড়া-v বিকল্প এবং এটি "সবকিছু" আউট সাফ করবেন ব্যতীত ভলিউম, অর্থাত্ পাত্রে, নেটওয়ার্ক, চিত্র, ইত্যাদি আমি কি যখন ডেটা অধ্যবসায় যার ফলে মোতায়েন পারে।
কোড_ড্রেড

13

আমি কোনও আপেক্ষিক পথ ব্যবহার করা এড়াতে চাই। মনে রাখবেন যে ডকারটি একটি ডেমন / ক্লায়েন্টের সম্পর্ক।

আপনি যখন এই রচনাটি সম্পাদন করছেন, এটি মূলত বিভিন্ন ডকার ক্লায়েন্ট কমান্ডগুলিতে বিভক্ত হয়, যা ডিমনকে দেওয়া হয়। যে ./databaseতারপর আপেক্ষিক ডেমন , না ক্লায়েন্ট।

এখন, ডকার দেব দলের এই ইস্যুতে কিছুটা পিছিয়ে আছে তবে নীচের অংশটি এটির কিছু অপ্রত্যাশিত ফলাফল হতে পারে।

সংক্ষেপে, কোনও আপেক্ষিক পথ ব্যবহার করবেন না, একটি নিখুঁত পথ ব্যবহার করুন।


এই উত্তরের জন্য ধন্যবাদ! দুঃখের বিষয়, আমি মনে করি এটি কাজ করে না। আমি লাইনটি একটি নিখুঁত পথে পরিবর্তন করেছি এবং ডেটা সন্নিবেশ করার পরে, database/dataফোল্ডারটি এখনও ফাঁকা = (
অ্যালেক্স লেনাইল

কে। নেক্সট আপটি docker inspectপাত্রে চালানো এবং কনটেইনারটি ভলিউম সম্পর্কে অবগত হওয়ার বিষয়টি নিশ্চিত করা (ঠিক তেমন ক্ষেত্রে রচনাগুলি বিভ্রান্ত বা কোনও কিছু ক্ষেত্রে)। (দ্রষ্টব্য: ডকার পরিদর্শন সংবেদনশীল ডেটা থাকতে পারে, তাই এটি munging ছাড়া এখানে এখানে পেস্ট করবেন না ;-) এর পরে, অনুমতি যাচাইয়ের বিষয়টি (যদিও এটি সাধারণত কোনও ত্রুটি দেখায়)
নিক বার্ক

আহা! @ নিক বার্কে আমি মনে করি আপনি কিছু খুঁজে পেয়েছেন। আমি প্রশ্ন আপডেট করেছি।
অ্যালেক্স লেনাইল

2

আমি মনে করি আপনাকে প্রথমে একটি দিয়ে ডকারের বাইরে আপনার ভলিউম তৈরি করতে docker create -v /location --nameহবে এবং তারপরে এটি পুনরায় ব্যবহার করুন।

এবং আমি যখন ডকারকে অনেক বেশি ব্যবহার করতাম তখন ডকফেরাইল সংজ্ঞা সহ একটি স্ট্যাটিক ডকার ভলিউম ব্যবহার করা সম্ভব ছিল না তাই আমার পরামর্শটি হ'ল কমান্ড লাইনটি চেষ্টা করুন (শেষ পর্যন্ত স্ক্রিপ্ট সহ)।

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