সাধারণত, হোস্ট ভলিউম মাউন্ট সহ অনুমতি সংক্রান্ত সমস্যাগুলি হ'ল কারণ হোস্টের ফাইলের uid / gid অনুমতি অনুযায়ী ধারকটির ভিতরে uid / gid ফাইলটিতে অ্যাক্সেস নেই। তবে এই নির্দিষ্ট কেসটি আলাদা।
অনুমতি স্ট্রিংয়ের শেষে বিন্দুটি drwxr-xr-x.
, নির্দেশ করে যে সেলইনক্স কনফিগার করা আছে। SELinux সহ একটি হোস্ট মাউন্ট ব্যবহার করার সময়, আপনাকে ভলিউম সংজ্ঞা শেষে একটি অতিরিক্ত বিকল্পটি পাস করতে হবে:
z
বিকল্প ইঙ্গিত করে যে বিষয়বস্তু বাঁধুন মাউন্ট একাধিক পাত্রে মধ্যে ভাগ করা হয়।
Z
বিকল্প ইঙ্গিত করে যে বিষয়বস্তু বাঁধুন মাউন্ট প্রাইভেট এবং ভাগমুক্ত হয়।
আপনার ভলিউম মাউন্ট কমান্ডটি এর পরে দেখতে পাবেন:
sudo docker run -i -v /data1/Downloads:/Downloads:z ubuntu bash
এসইএলিনাক্স সহ হোস্ট মাউন্টগুলি সম্পর্কে আরও এখানে দেখুন: https://docs.docker.com/storage/#configure-the-selinux-label
অন্যরা যারা এই বিষয়টিকে বিভিন্ন ব্যবহারকারী হিসাবে চলমান ধারকগুলির সাথে দেখেন তাদের জন্য আপনাকে কনটেইনারটির অভ্যন্তরের ব্যবহারকারীর uid / gid এর হোস্টের ফাইলটিতে অনুমতি আছে কিনা তা নিশ্চিত করতে হবে। প্রোডাকশন সার্ভারগুলিতে, ফাইলগুলিতে অ্যাক্সেস রয়েছে এমন হোস্টের (অথবা আরও ভাল, উত্পাদনে হোস্ট মাউন্টগুলি ব্যবহার করবেন না) মেলে একটি ইউআইডি / গিডের সাথে মেলে ইমেজ বিল্ড প্রক্রিয়ায় uid / gid নিয়ন্ত্রণ করার মাধ্যমে এটি প্রায়শই করা হয়।
একটি নামযুক্ত ভলিউম প্রায়শই হোস্টিং মাউন্টগুলিতে পছন্দ করা হয় কারণ এটি কোনও ফাইলের মালিকানা এবং অনুমতি সহ চিত্রের ডিরেক্টরি থেকে ভলিউম ডিরেক্টরিটি আরম্ভ করবে। এটি ঘটে যখন ভলিউম খালি থাকে এবং ধারকটি নামযুক্ত ভলিউম সহ তৈরি হয়।
ম্যাকওএস ব্যবহারকারীদের এখন ওএসএক্সএফএস রয়েছে যা ম্যাক হোস্ট এবং ধারকগুলির মধ্যে uid / gid এর স্বয়ংক্রিয়ভাবে পরিচালনা করে। এটি যে জায়গাতে সহায়তা করে না সেগুলি হ'ল এম্বেড করা ভিএম এর ভিতরে থেকে ফাইলগুলি যা /var/lib/docker.sock এর মত ধারকটিতে বসানো হয়।
বিকাশকারী পরিবেশের জন্য যেখানে হোস্ট ইউআইডি / গিডটি প্রতি বিকাশকারী পরিবর্তিত হতে পারে, আমার পছন্দের সমাধানটি হ'ল ভলিউড uid / gid মেলানোর জন্য ধারকটির অভ্যন্তরে ব্যবহারকারীর uid / gid স্থির করে, রুট হিসাবে চলমান একটি এন্টিয়েন্ট পয়েন্ট সহ ধারকটি শুরু করা এবং এবং তারপরে gosu
ধারকটির ভিতরে অ্যাপ্লিকেশন চালানোর জন্য রুট থেকে কন্টেইনার ব্যবহারকারীর কাছে নেমে যান। এর জন্য গুরুত্বপূর্ণ স্ক্রিপ্টটি fix-perms
আমার বেস চিত্রের স্ক্রিপ্টগুলিতে রয়েছে, যা এখানে পাওয়া যাবে: https://github.com/sudo-bmitch/docker-base
fix-perms
স্ক্রিপ্ট থেকে গুরুত্বপূর্ণ বিটটি হ'ল:
# update the uid
if [ -n "$opt_u" ]; then
OLD_UID=$(getent passwd "${opt_u}" | cut -f3 -d:)
NEW_UID=$(stat -c "%u" "$1")
if [ "$OLD_UID" != "$NEW_UID" ]; then
echo "Changing UID of $opt_u from $OLD_UID to $NEW_UID"
usermod -u "$NEW_UID" -o "$opt_u"
if [ -n "$opt_r" ]; then
find / -xdev -user "$OLD_UID" -exec chown -h "$opt_u" {} \;
fi
fi
fi
এটি কনটেইনারটির ভিতরে ব্যবহারকারীর uid এবং ফাইলের uid পায় এবং যদি এটি মেলে না, usermod
তবে ইউআইডি সামঞ্জস্য করার জন্য কল করে। অবশেষে এটি ইউডি'র পরিবর্তন না করে এমন কোনও ফাইল ঠিক করার জন্য পুনরাবৃত্তি অনুসন্ধান করে। আমি -u $(id -u):$(id -g)
পতাকা সহ একটি ধারক চালানোর চেয়ে এটি আরও ভাল পছন্দ করি কারণ উপরের এন্টিপয়েন্ট কোডটিতে প্রতিটি বিকাশকারীকে ধারক শুরু করার জন্য স্ক্রিপ্ট চালানোর প্রয়োজন হয় না এবং ব্যবহারকারীর মালিকানাধীন ভলিউমের বাইরে যে কোনও ফাইলই তাদের অনুমতি সংশোধন করতে পারে।
আপনি একটি ডাইনার একটি ইমেজ থেকে একটি হোস্ট ডিরেক্টরি সূচনা করতে পারে এমন একটি নামযুক্ত ভলিউম ব্যবহার করে যা একটি বাইন্ড মাউন্টটি সম্পাদন করে। এই ডিরেক্টরিটি অবশ্যই আগ থেকেই থাকতে হবে এবং আপনাকে কোনও রচনা ফাইলের হোস্ট ভলিউমের বিপরীতে হোস্ট ডিরেক্টরিতে একটি নিখুঁত পথ সরবরাহ করতে হবে যা আপেক্ষিক পাথ হতে পারে। ডিরেক্টরিটি শুরু করার জন্য ডকারের জন্য খালিও থাকতে হবে। একটি বাঁধন মাউন্ট বর্ণিত নাম ভলিউম সংজ্ঞায়িত করার জন্য তিনটি পৃথক বিকল্প:
# create the volume in advance
$ docker volume create --driver local \
--opt type=none \
--opt device=/home/user/test \
--opt o=bind \
test_vol
# create on the fly with --mount
$ docker run -it --rm \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
foo
# inside a docker-compose file
...
volumes:
bind-test:
driver: local
driver_opts:
type: none
o: bind
device: /home/user/test
...
সবশেষে, আপনি যদি ব্যবহারকারীর নেমস্পেসগুলি ব্যবহার করার চেষ্টা করেন, আপনি দেখতে পাবেন যে হোস্ট ভলিউমের অনুমতি সংক্রান্ত সমস্যা রয়েছে কারণ ud / gid এর পাত্রে স্থানান্তরিত হয়েছে। সেই দৃশ্যে হোস্ট ভলিউম এড়ানো এবং কেবল নামকরণকৃত ভলিউম ব্যবহার করা সম্ভবত সবচেয়ে সহজ।