macOS-এ ডকার কম্পোজের একটি নেমড ভলিউম রিস্টোর করতে, সেটিতে ডেটা রাইট করছে এমন সার্ভিসগুলো বন্ধ করুন, ডকার ভলিউমের সঠিক নামটি শনাক্ত করুন এবং একটি অস্থায়ী কন্টেইনার ব্যবহার করে ব্যাকআপ আর্কাইভটি সেই ভলিউমে এক্সট্র্যাক্ট করুন। ডকার ডেস্কটপ লিনাক্স ভলিউমগুলোকে তার নিজস্ব লিনাক্স ভিএম-এর ভেতরে রাখে, তাই ফাইন্ডারে ডকারের ইন্টারনাল ফাইলগুলো এডিট করার চেষ্টা না করে সেগুলোতে অ্যাক্সেস পেতে ডকার সিএলআই ব্যবহার করুন। ডকারের ভলিউম নির্দেশিকা-তে কন্টেইনার-ভিত্তিক রিস্টোর পদ্ধতির ব্যাখ্যা রয়েছে, এবং ডকার ডেস্কটপের নেটওয়ার্কিং ওভারভিউ-তে ম্যাকে ব্যবহৃত লিনাক্স ভিএম সম্পর্কে বিস্তারিত বলা হয়েছে।
রিস্টোর করার আগে: আর্কাইভ এবং কম্পোজ প্রজেক্ট পরীক্ষা করুন
নিশ্চিত করুন ডকার ডেস্কটপ চালু আছে, তারপর টার্মিনাল খুলুন এবং আপনার কম্পোজ ফাইলটি যে ডিরেক্টরিতে রয়েছে সেখানে যান। ফাইন্ডারে আর্কাইভটি খুঁজুন, অথবা টার্মিনালে এর নামটি নিশ্চিত করুন। নিচের উদাহরণগুলোতে ধরে নেওয়া হয়েছে যে এর নাম backup.tar এবং এটি backup-files নামের একটি ফোল্ডারে রয়েছে; আপনার ফাইলের সাথে মিলিয়ে এই মানগুলো পরিবর্তন করে নিন।
আর্কাইভটি এক্সট্র্যাক্ট করার আগে এর ভেতরের বিষয়বস্তু পরীক্ষা করুন। এটি আপনাকে বুঝতে সাহায্য করবে যে ফাইলগুলো সরাসরি আর্কাইভের রুটে সংরক্ষিত আছে নাকি data/-এর মতো কোনো প্যারেন্ট ডিরেক্টরির অধীনে রয়েছে।
tar -tf "$HOME/backup-files/backup.tar" | head -30
head কমান্ডটি তালিকার প্রথম ৩০টি পাথ প্রদর্শন করার মধ্যে সীমাবদ্ধ রাখে; এটি আর্কাইভের কোনো পরিবর্তন করে না। পাথগুলো কোনো ডিরেক্টরি প্রিফিক্স দিয়ে শুরু হয়েছে কিনা তা খেয়াল করুন। অ্যাপ্লিকেশনের ডেটা ডিরেক্টরিতে আপনাকে সঠিক লেভেলটি এক্সট্র্যাক্ট করতে হবে। ডকারের ডকুমেন্টেশনে দেওয়া উদাহরণে --strip 1 ব্যবহার করা হয়েছে কারণ তাদের আর্কাইভে একটি টপ-লেভেল ডিরেক্টরি রয়েছে; আপনার আর্কাইভে যদি এমন কোনো প্রিফিক্স না থাকে তবে স্বয়ংক্রিয়ভাবে এই অপশনটি ব্যবহার করবেন না। ডকারের রিস্টোর সংক্রান্ত উদাহরণ-এ দেখানো হয়েছে কিভাবে এক্সট্র্যাকশন পাথ রিস্টোর করা লেআউটকে প্রভাবিত করে।
ভলিউমের সঠিক নামটি শনাক্ত করুন
db-data-এর মতো কোনো কম্পোজ ভলিউম কী ডকার ভলিউমের পূর্ণ নাম নাও হতে পারে। কম্পোজ সাধারণত এর শুরুতে প্রজেক্টের নাম প্রিফিক্স হিসেবে যোগ করে, তবে name: বা external: true দিয়ে কনফিগার করা ভলিউম ভিন্ন নাম ব্যবহার করতে পারে। কম্পোজ ভলিউম রেফারেন্স-এ নামকরণের এই অপশনগুলো ব্যাখ্যা করা হয়েছে।
আপনার সার্ভিসটি কোনটি ব্যবহার করছে তা নির্ধারণ করতে ভলিউমগুলোর তালিকা দেখুন এবং কম্পোজ কনফিগারেশন পরীক্ষা করুন:
docker volume ls
docker compose config
রেন্ডার করা কম্পোজ কনফিগারেশনে সার্ভিসের ভলিউম ম্যাপিং এবং নির্ধারিত ভলিউম নামটি খুঁজুন। আপনার যদি কোনো সম্ভাব্য ভলিউম যাচাই করার প্রয়োজন হয়, তবে docker volume inspect VOLUME_NAME রান করুন, যেখানে VOLUME_NAME-এর জায়গায় প্রকৃত নামটি বসাবেন। পরবর্তী পদক্ষেপে যাওয়ার আগে নিশ্চিত করুন যে এটি কাঙ্ক্ষিত প্রজেক্ট এবং সার্ভিসের অন্তর্গত; ভুল ভলিউমে রিস্টোর করলে সম্পর্কহীন ডেটা ওভাররাইট হয়ে যেতে পারে।
রাইটারগুলো বন্ধ করুন এবং ব্যাকআপ রিস্টোর করুন
রিস্টোর করার আগে কম্পোজ সার্ভিসগুলো বন্ধ করুন যাতে এক্সট্র্যাকশনের সময় অ্যাপ্লিকেশন ফাইলে কোনো পরিবর্তন না করে। docker compose down রান করলে প্রজেক্টের কন্টেইনার এবং নেটওয়ার্কগুলো বন্ধ ও অপসারিত হয়; তবে ডিফল্টভাবে এটি নেমড ভলিউমগুলোকে অক্ষত রাখে। -v বা --volumes যোগ করা থেকে বিরত থাকুন, কারণ এটি কম্পোজ-পরিচালিত নেমড ভলিউমগুলোকে মুছে ফেলে। ডকারের compose down রেফারেন্স-এ এই আচরণের তালিকা রয়েছে।
docker compose down
আপনি যে ভলিউম নামটি নিশ্চিত করেছেন সেটির জন্য একটি শেল ভেরিয়েবল সেট করুন, তারপর একটি অস্থায়ী কন্টেইনার ব্যবহার করে আর্কাইভটি এক্সট্র্যাক্ট করুন। এই উদাহরণটিতে অফিসিয়াল alpine ইমেজ ব্যবহার করা হয়েছে, ব্যাকআপ ফোল্ডারটিকে রিড-অনলি হিসেবে মাউন্ট করা হয়েছে এবং টার্গেট ভলিউমটিকে /restore-এ মাউন্ট করা হয়েছে। আপনার প্রকৃত নাম ভিন্ন হলে myproject_db-data পরিবর্তন করুন। ইমেজটি লোকালভাবে উপলব্ধ থাকতে হবে অথবা ডকারের সেটি পুল করার সক্ষমতা থাকতে হবে।
VOLUME_NAME='myproject_db-data'
BACKUP_DIR="$HOME/backup-files"
docker run --rm \
--mount "type=volume,source=$VOLUME_NAME,target=/restore" \
--mount "type=bind,source=$BACKUP_DIR,target=/backup,readonly" \
alpine sh -c 'cd /restore && tar -xf /backup/backup.tar --strip-components=1'
এই কমান্ডটি ধরে নেয় যে আর্কাইভটিতে একটি একক ঘেরা ডিরেক্টরি লেভেল রয়েছে, উদাহরণস্বরূপ data/file.db। আর্কাইভ তালিকায় যদি সরাসরি রুটে ফাইলগুলো দেখা যায়, তবে --strip-components=1 সরিয়ে দিন। পাথগুলোর যদি ভিন্ন কোনো কমন প্রিফিক্স থাকে, তবে অপসারণ করার জন্য কম্পোনেন্টের সংখ্যাটি এমনভাবে বেছে নিন যাতে অ্যাপ্লিকেশনের প্রত্যাশিত ফাইলগুলো সরাসরি /restore-এর অধীনে পৌঁছায়। --mount সিনট্যাক্সটি স্পষ্টভাবে একটি নেমড ভলিউম এবং একটি হোস্ট ডিরেক্টরি সংযুক্ত করে; ডকার তার ভলিউম নির্দেশিকা-তে এই মাউন্ট অপশনগুলো এবং রিস্টোরের প্যাটার্ন নথিভুক্ত করেছে।
এই এক্সট্র্যাকশনটি মিলে যাওয়া পাথের ফাইলগুলোকে প্রতিস্থাপন করে কিন্তু ভলিউমে আগে থেকেই থাকা সম্পর্কহীন ফাইলগুলোকে মুছে ফেলে না। আপনার যদি ব্যাকআপের হুবহু প্রতিরূপ প্রয়োজন হয়, তবে মার্জ-স্টাইলের এক্সট্র্যাকশন যথেষ্ট নয়: প্রথমে বর্তমান ভলিউমটির একটি পৃথক ব্যাকআপ নিন, তারপর আর্কাইভ এবং টার্গেট নিশ্চিত করার পর সতর্কতার সাথে ক্লিনআপ পদ্ধতি ব্যবহার করুন। আপনি শনাক্ত করেননি এমন কোনো ভলিউমের বিরুদ্ধে ঢালাওভাবে ডিলিট কমান্ড রান করবেন না।
প্রজেক্টটি চালু করুন এবং ফলাফল পরীক্ষা করুন
কম্পোজ সার্ভিসগুলো পুনরায় চালু করুন:
docker compose up -d
কম্পোজ প্রজেক্টে ঘোষিত বিদ্যমান কোনো ভলিউম পুনরায় ব্যবহার করে, আর সেটি না থাকলে নতুন একটি তৈরি করে। কম্পোজ ভলিউম রেফারেন্স-এ সেই আচরণের বিবরণ রয়েছে। সার্ভিসের লগগুলো পরীক্ষা করুন এবং যেখানে প্রযোজ্য, অ্যাপ্লিকেশনের নিজস্ব ইন্টিগ্রিটি বা ডেটাবেস রিকভারি চেকগুলো ব্যবহার করুন। রিস্টোর সফল হয়েছে বলে ধরে নেওয়ার আগে প্রত্যাশিত রেকর্ড বা ফাইলগুলো উপস্থিত রয়েছে কিনা তা নিশ্চিত করুন।
সার্ভিস যদি কোনো খালি ডেটা ডিরেক্টরি রিপোর্ট করে, তবে ভলিউমের নাম, হোস্ট ডিরেক্টরির পাথ এবং আর্কাইভের ডিরেক্টরি কাঠামো পুনরায় যাচাই করুন। এছাড়াও ভেরিফাই করুন যে আর্কাইভটি অ্যাপ্লিকেশন ভার্সনের সাথে সামঞ্জস্যপূর্ণ এবং ব্যাকআপটি এমন অবস্থায় নেওয়া হয়েছিল যেখান থেকে অ্যাপ্লিকেশনটি রিকভার করতে সক্ষম। একটি সফল tar এক্সট্র্যাকশন কেবল ফাইলগুলো আনপ্যাক হওয়ার বিষয়টি নিশ্চিত করে; অ্যাপ্লিকেশনের ডেটা যে কার্যকর বা বৈধ তা নিশ্চিত করে না।
তথ্যসূত্র
Volumes — Docker
docker compose down — Docker
Networking on Docker Desktop — Docker