macOS-এ docker compose up করার পর যদি আপনার ইমেজ থেকে আসা ফাইলগুলো অদৃশ্য হয়ে যায়, তবে একটি বাইন্ড মাউন্ট তাদের কন্টেইনার ডিরেক্টরিটিকে ঢেকে ফেলছে কিনা তা পরীক্ষা করুন। একটি বাইন্ড মাউন্ট হোস্ট ফোল্ডারের বিষয়বস্তুকে মাউন্ট টার্গেটে দৃশ্যমান করে তোলে, যা ইমেজে ইতিমধ্যে থাকা ফাইলগুলোকে আড়াল করে দেয়। নির্দিষ্ট ম্যাপিংটি খুঁজুন, এর হোস্ট বা কন্টেইনার পাথ সংশোধন করুন—অথবা অপ্রয়োজনীয় হলে এটি সরিয়ে ফেলুন—এবং ক্ষতিগ্রস্ত সার্ভিসটি পুনরায় তৈরি করুন। ডকারের নথিপত্র অনুসারে মাউন্ট ছাড়া কন্টেইনারটি পুনরায় তৈরি করাই হলো ইমেজের মূল ফাইলগুলো আবার দৃশ্যমান করার উপায়। (Bind mounts)
একটি বাইন্ড মাউন্ট কেন ফাইল লুকিয়ে ফেলে
একটি বাইন্ড মাউন্ট হোস্টের একটি পাথের সাথে কন্টেইনারের একটি পাথকে সংযুক্ত করে। উদাহরণস্বরূপ, ./app:/usr/src/app মাউন্ট করলে হোস্টের app ফোল্ডারটি /usr/src/app-এ প্রদর্শিত হয়। ইমেজে যদি ইতিমধ্যে সেখানে ফাইল থাকে, তবে সেগুলো ইমেজের অংশ হিসেবেই থেকে যায় কিন্তু মাউন্ট সক্রিয় থাকা অবস্থায় লুকানো থাকে। এর ফলে একটি সচল ইমেজ খালি দেখাতে পারে অথবা এর কাঙ্ক্ষিত প্রোগ্রামটি ঢাকা পড়ে যাওয়ার কারণে স্টার্টআপে ত্রুটি হতে পারে। একই আচরণ ম্যাকেও ঘটে; ডকার ডেস্কটপ তার লিনাক্স ভার্চুয়াল মেশিনের মাধ্যমে হোস্ট ফাইল অ্যাক্সেসের সমন্বয় করে। (Bind mounts)
এটি ফাইল পারমিশন সমস্যা থেকে আলাদা: কন্টেইনার হয়তো মাউন্ট করা ডিরেক্টরিটি সঠিকভাবে পড়তে পারছে, কিন্তু এটি ইমেজের ডিরেক্টরির ফাইলের পরিবর্তে ভিন্ন একটি ফাইলের সেট পড়ছে। মালিকানা পরিবর্তন বা ইমেজ পুনর্নির্মাণের আগে ম্যাপিংটি পরীক্ষা করুন।
আপনার কম্পোজ ফাইলে ম্যাপিংটি খুঁজুন
প্রজেক্টটি শুরু করতে ব্যবহৃত কম্পোজ ফাইলটি খুলুন এবং ক্ষতিগ্রস্ত সার্ভিসের volumes: এন্ট্রিগুলো চিহ্নিত করুন। ./app:/usr/src/app-এর মতো একটি সংক্ষিপ্ত-রূপের এন্ট্রি মূলত একটি বাইন্ড মাউন্ট যখন এর সোর্স একটি হোস্ট পাথ হয়। লোকাল কম্পোজে, একটি রিলেটিভ সোর্স পাথ কম্পোজ ফাইলের প্যারেন্ট ডিরেক্টরি থেকে নির্ধারিত হয়। এর অর্থ হলো, কম্পোজ ফাইলটি যদি কোনো সাবডিরেক্টরিতে থাকে, তবে ./app আপনার প্রত্যাশার চেয়ে ভিন্ন কোনো ফোল্ডারকে নির্দেশ করতে পারে। (Compose services reference)
নির্ধারিত কনফিগারেশন এবং সার্ভিসের স্থিতি দেখতে, macOS টার্মিনালে প্রজেক্ট ডিরেক্টরি থেকে এই কমান্ডগুলো চালান:
docker compose config
docker compose ps
রেন্ডার করা কনফিগারেশনে, প্রতিটি মাউন্টের source (ম্যাক পাথ)-এর সাথে এর target (কন্টেইনার পাথ) তুলনা করুন। তারপর টার্গেটের সাথে ইমেজের ওয়ার্কিং ডিরেক্টরি এবং যে ডিরেক্টরিতে অ্যাপ্লিকেশন ফাইলগুলো প্রত্যাশিত তা তুলনা করুন। .:/usr/src/app-এর মতো একটি বিস্তৃত মাউন্ট সম্পূর্ণ অ্যাপ্লিকেশন ডিরেক্টরিটিকে ঢেকে ফেলতে পারে; ./config:/usr/src/app/config-এর মতো একটি সংকীর্ণ ম্যাপিং ইমেজের বাকি ডিরেক্টরিটিকে দৃশ্যমান রাখে।
সঠিক সমাধান বেছে নিন
সার্ভিসটির যদি সোর্স কোডে লাইভ অ্যাক্সেসের প্রয়োজন হয়, তবে একটি বাইন্ড মাউন্ট রাখুন কিন্তু সেটিকে সঠিক হোস্ট ফোল্ডার এবং কাঙ্ক্ষিত কন্টেইনার সাবডিরেক্টরিতে নির্দেশ করুন। নিশ্চিত করুন যে হোস্ট ডিরেক্টরিতে আপনার প্রত্যাশিত ফাইলগুলো রয়েছে। কম্পোজের সংক্ষিপ্ত সিনট্যাক্স কোনো অনুপস্থিত বাইন্ড সোর্সের ক্ষেত্রে একটি ডিরেক্টরি তৈরি করে ফেলে, তাই একটি টাইপো অসাবধানতাবশত কন্টেইনারকে একটি খালি ফোল্ডার দিতে পারে। স্পষ্ট নিয়ন্ত্রণের জন্য, create_host_path: false সহ লং সিনট্যাক্স ব্যবহার করুন; কম্পোজ তখন ডিরেক্টরি তৈরি করার পরিবর্তে সোর্স অনুপস্থিত থাকার ত্রুটি রিপোর্ট করবে। (Compose services reference)
services:
app:
volumes:
- type: bind
source: ./app
target: /usr/src/app
bind:
create_host_path: false
অ্যাপ্লিকেশন ফাইলগুলো যদি ইমেজেরই সরবরাহ করার কথা থাকে, তবে সেই ডিরেক্টরিটিকে লক্ষ্য করে করা মাউন্টটি সরিয়ে ফেলুন। কেবল কনফিগারেশন বা কোনো একটি জেনারেট করা ফোল্ডারের জন্য যদি হোস্ট অ্যাক্সেসের প্রয়োজন হয়, তবে কেবল সেই সাবডিরেক্টরিটি মাউন্ট করুন। ডাটাবেসের মতো পারসিস্টেন্ট কন্টেইনার ডেটার জন্য, এর পরিবর্তে একটি নেমড ভলিউম ব্যবহারের কথা বিবেচনা করুন: ডকার নিজেই এর স্টোরেজ পরিচালনা করে এবং এটি কোনো নির্দিষ্ট ম্যাক ডিরেক্টরির সাথে সেই ডেটাকে আবদ্ধ করা এড়ায়। (Volumes)
সার্ভিসটি পুনরায় তৈরি করুন এবং যাচাই করুন
কম্পোজ ফাইলটি সম্পাদনা করার পর, ক্ষতিগ্রস্ত সার্ভিসটি পুনরায় তৈরি করুন যাতে এটি আপডেট করা মাউন্টগুলো ব্যবহার করে। নিচের কোডে app-এর স্থলে আপনার ফাইলের সার্ভিসের নামটি দিন:
docker compose up -d --force-recreate app
docker compose exec app sh -c 'ls -la /usr/src/app'
ls কমান্ডটি যাচাই করে যে কন্টেইনারটি টার্গেটে কী দেখতে পাচ্ছে; আপনার সার্ভিস যদি ভিন্ন পাথ ব্যবহার করে তবে পাথটি পরিবর্তন করুন। ইমেজে যদি কোনো শেল না থাকে বা ls অনুপস্থিত থাকে, তবে docker compose logs app দিয়ে এর স্টার্টআপ লগ পরীক্ষা করুন এবং সেই ইমেজে উপলব্ধ একটি ডায়াগনস্টিক কমান্ড ব্যবহার করুন। কন্টেইনারের মাউন্ট সোর্স এবং গন্তব্য পরীক্ষা করার জন্য ডকার docker inspect-এর ব্যবহারের নথিপত্রও সরবরাহ করে; কম্পোজের ক্ষেত্রে, প্রথমে docker compose ps থেকে এর কন্টেইনারের নামটি নিন, তারপর docker inspect CONTAINER_NAME চালান। (Bind mounts)
সোর্সটি যদি ডকার ডেস্কটপের শেয়ার করা ফোল্ডারগুলোর বাইরে থাকে, অথবা আপনি যদি Mounts denied বা file is not shared from the host দেখতে পান, তবে ডকার ডেস্কটপের Settings > Resources > File sharing পরীক্ষা করুন এবং নির্দিষ্ট ম্যাক ডিরেক্টরিটি যোগ করুন। ডকার ডিফল্টভাবে /Users, /Volumes, /private, /tmp, এবং /var/folders শেয়ার করা হিসেবে তালিকাভুক্ত করে, তবে এই অবস্থানগুলোর বাইরের ডিরেক্টরিগুলো ম্যানুয়ালি যোগ করার প্রয়োজন হতে পারে। Docker VMM বাইন্ড মাউন্ট অটো-শেয়ার সমর্থন করে না, তাই সেই ব্যাকএন্ডের জন্য ম্যানুয়ালি ডিরেক্টরি যোগ করা আবশ্যক। (Docker Desktop settings, Virtual Machine Manager)
ইমেজ ফাইল লুকিয়ে ফেলা একটি মাউন্ট সাধারণত এর সোর্স বা টার্গেট সংশোধন করে, এর পরিধি সংকীর্ণ করে, অথবা এটি সরিয়ে দিয়ে সার্ভিসটি পুনরায় তৈরি করার মাধ্যমে সমাধান করা যায়। কন্টেইনারের যখন একটি নির্দিষ্ট হোস্ট ফোল্ডারের প্রয়োজন হয় তখন একটি বাইন্ড মাউন্ট রাখুন; অন্যথায়, ইমেজকে তার নিজস্ব ফাইল সরবরাহ করতে দিন বা একটি ডকার-পরিচালিত ভলিউমে পারসিস্টেন্ট ডেটা সংরক্ষণ করুন।
তথ্যসূত্র
Bind mounts — Docker Docs
Define services in Docker Compose — Docker Docs
Change your Docker Desktop settings — Docker Docs
Virtual Machine Manager — Docker Docs
Volumes — Docker Docs