ডকারে হোস্ট ডিরেক্টরিতে অ্যাক্সেসের অনুমতি অস্বীকৃত


282

সংক্ষেপে: আমি ডকারে একটি হোস্ট ডিরেক্টরিটি মাউন্ট করার চেষ্টা করছি তবে অ্যাক্সেসের অনুমতিগুলি দেখতে ভাল লাগলেও আমি ধারকটির মধ্যে থেকে এটিকে অ্যাক্সেস করতে পারি না।

বিস্তারিত:

আমি করিতেছি

sudo docker run -i -v /data1/Downloads:/Downloads ubuntu bash

এবং তারপর

ls -al

এটি আমাকে দেয়:

total 8892
drwxr-xr-x.  23 root root    4096 Jun 18 14:34 .
drwxr-xr-x.  23 root root    4096 Jun 18 14:34 ..
-rwxr-xr-x.   1 root root       0 Jun 18 14:34 .dockerenv
-rwx------.   1 root root 9014486 Jun 17 22:09 .dockerinit
drwxrwxr-x.  18 1000 1000   12288 Jun 16 11:40 Downloads
drwxr-xr-x.   2 root root    4096 Jan 29 18:10 bin
drwxr-xr-x.   2 root root    4096 Apr 19  2012 boot
drwxr-xr-x.   4 root root     340 Jun 18 14:34 dev
drwxr-xr-x.  56 root root    4096 Jun 18 14:34 etc
drwxr-xr-x.   2 root root    4096 Apr 19  2012 home

এবং এর মতো আরও অনেক লাইন (আমার মনে হয় এটি প্রাসঙ্গিক অংশ)।

যদি আমি করি

cd /Downloads
ls

ফলাফল হলো

ls: cannot open directory .: Permission denied

হোস্টটি ফেডোরা 20, ডকার 1.0.0 এবং go1.2.2 সহ।

ভুল হচ্ছে কি?

উত্তর:


269

সম্পূর্ণ গল্পের জন্য ভলিউম এবং সেলইনাক্স সম্পর্কে এই প্রকল্পের পারমাণবিক ব্লগ পোস্টটি দেখুন ।

বিশেষ করে:

এটি সহজেই সহজ হয়েছে কারণ শেষ পর্যন্ত ডকার একটি প্যাচটি মার্জ করেছে যা ডকার -১.7-এ প্রদর্শিত হবে (আমরা আরএইচইএল, সেন্টোস এবং ফেডোরায় ডকার-১. in তে প্যাচটি বহন করে চলেছি)।

এই প্যাচটি ভলিউম মাউন্টগুলির (-v) বিকল্প হিসাবে "z" এবং "জেড" এর জন্য সমর্থন যোগ করে।

উদাহরণ স্বরূপ:

docker run -v /var/db:/var/db:z rhel7 /bin/sh

chcon -Rt svirt_sandbox_file_t /var/db ম্যান পৃষ্ঠাতে বর্ণিত স্বয়ংক্রিয়ভাবে করবে ।

আরও ভাল, আপনি জেড ব্যবহার করতে পারেন

docker run -v /var/db:/var/db:Z rhel7 /bin/sh

এটি কনটেইনারটির ভিতরে থাকা সামগ্রীটিকে সঠিক এমসিএস লেবেলের সাথে লেবেল করবে যা কনটেইনারটি চলবে, মূলত এটি chcon -Rt svirt_sandbox_file_t -l s0:c1,c2 /var/dbযেখানে চালিত হয় s0:c1,c2প্রতিটি পাত্রে আলাদা হয়।


18
এটি একটি কবজির মতো কাজ করে। অন্যান্য সমাধানগুলি বেশিরভাগই কর্মক্ষেত্র।
tuxdna


ওহ, মানুষ, এটা সত্যিই কাজ করে। অবশেষে আমি এটি খুঁজে পেয়েছি। অনেক ধন্যবাদ! এটি সম্পর্কে কোন অফিসিয়াল ডকুমেন্টেশন আছে?
কারবি

1
প্রবাহটি এ বিভাগের শেষ অনুচ্ছেদ হিসাবে এটি করেছে ডকস.ডকার.ইঞ্জিন
রেফারেন্স /

1
কমা দ্বারা পৃথক পৃথক একই সময়ে উভয় বিকল্প ব্যবহার করে একই সময়ে কেবলমাত্র পঠনযোগ্য হিসাবে ভলিউম মাউন্ট করার সময় SELinux এর আওতায় অনুমতিগুলি ঠিক করা সম্ভব -v $(pwd):/app:ro,Z। এটি সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত।
ডানিরোদ

263

এটি সেলইনক্স ইস্যু।

আপনি সাময়িকভাবে ইস্যু করতে পারেন

su -c "setenforce 0"

অ্যাক্সেস করতে হোস্টে বা অন্যথায় চালিয়ে একটি সেলইনক্স বিধি যুক্ত করুন

chcon -Rt svirt_sandbox_file_t /path/to/volume

3
হোস্টের পাথ / টু / ভলিউম কি? যদি তাই মনে হয় না যে সমাধানটি ডেটা পাত্রে কাজ করবে?
রায় ট্রুইলোভ

6
su -c "সেটেনফোর্স 1" করতে ভুলবেন না ... অন্যথায় এটি কেবলমাত্র কাজ করবে কারণ
সেলইনাক্স

এটি আমার সমস্যার সমাধান করেছে। আপনাকে ধন্যবাদ, আমি আশা করি তারা এটির জন্য একটি ঠিক আছে।
হোকুতোসেই

19
সেলিনাক্স নিয়ম যুক্ত করা সবচেয়ে ভাল উপায়, কারণ বেশিরভাগ ক্ষেত্রে সুবিধাযুক্ত মোডযুক্ত পাত্রে চালানো ভাল ধারণা নয়।
জোরো_77

7
জোরো_77 যেমন বলেছে, একটি নিয়ম যোগ করুন এবং স্টপডিসাব্লিংসেলিনাক্স ডটকম ;)
গ্যাবলেক্স

71

সতর্কতা: এই সমাধানটির সুরক্ষা ঝুঁকি রয়েছে।

অধিকারযুক্ত হিসাবে ধারক চালানোর চেষ্টা করুন:

sudo docker run --privileged=true -i -v /data1/Downloads:/Downloads ubuntu bash

আরেকটি বিকল্প (যা আমি চেষ্টা করি নি) এটি হ'ল একটি সুবিধাযুক্ত ধারক তৈরি করা এবং তারপরে এর মধ্যে অন-সুবিধাযুক্ত পাত্রে তৈরি করা।


1
@ জবার্নার্ডো দুটি বিকল্পের মধ্যে কোনটি সমস্যার সমাধান করেছে?
ব্যবহারকারী 100464

@ ব্যবহারকারী 100464--privileged=true
জবার্নার্ডো

1
আমার ক্ষেত্রে সাহায্য করবেন না। ডাবিয়ান হুইজি ব্যাকপোর্টেড কার্নেল ৩.১16 সহ তবে সিলিনাক্স কনফিগারেশন সক্রিয় করা হয়নি। :(
অহলব্রিচ

যদি আপনি ডকার-সুরকার ব্যবহার করে 'সুবিধাযুক্ত: সত্য' যোগ করেন
লিওনেল মরিসন

35
এটা করো না. --privilegedনিরাপত্তা ঝুঁকি
নভিন 26'16

38

সাধারণত, হোস্ট ভলিউম মাউন্ট সহ অনুমতি সংক্রান্ত সমস্যাগুলি হ'ল কারণ হোস্টের ফাইলের 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 এর পাত্রে স্থানান্তরিত হয়েছে। সেই দৃশ্যে হোস্ট ভলিউম এড়ানো এবং কেবল নামকরণকৃত ভলিউম ব্যবহার করা সম্ভবত সবচেয়ে সহজ।


32

অ্যাক্সেস.রেড ডট কম থেকে : শেয়ারিং_ডাটা_আক্রস_ কনটেনার :

হোস্ট ভলিউম সেটিংস পোর্টেবল নয়, যেহেতু তারা হোস্ট-নির্ভর এবং সম্ভবত অন্য কোনও মেশিনে কাজ না করে। এই কারণে, ধারকটিতে হোস্ট ডিরেক্টরিগুলি মাউন্ট করার জন্য কোনও ডকফেরফিল সমতুল্য নয়। এছাড়াও, সচেতন থাকুন যে হোস্ট সিস্টেমটিতে ধারক SELinux নীতি সম্পর্কে কোনও জ্ঞান নেই। অতএব, যদি সেলইনাক্স নীতি প্রয়োগ করা হয় তবে মাউন্ট হোস্ট ডিরেক্টরিটি আর ডাব্লু সেটিং নির্বিশেষে ধারকটিতে লিখনযোগ্য নয়। বর্তমানে, আপনি হোস্ট ডিরেক্টরিতে যথাযথ SELinux নীতি প্রকারটি বরাদ্দ করে এটিকে ঘিরে কাজ করতে পারেন ":

chcon -Rt svirt_sandbox_file_t host_dir

যেখানে হোস্ট_ডিরটি হোস্ট সিস্টেমের ডিরেক্টরিতে যা একটি ধারককে মাউন্ট করা হয়।

এটি কেবলমাত্র এক কর্মচঞ্চল বলে মনে হয়, তবে আমি চেষ্টা করেছিলাম এবং এটি কার্যকর হয়।


14

আমি যাচাই করেছি যা chcon -Rt svirt_sandbox_file_t /path/to/volumeকাজ করে এবং আপনাকে কোনও সুবিধাযুক্ত ধারক হিসাবে চালাতে হবে না।

এটি চালু:


2
ডকের মধ্যে পুনর্বিবেচনার জন্য সরকারী সহায়তার জন্য github.com/docker/docker/pull/5910 দেখুন ।
cpuguy83

13

ব্যবহার করে দেখুন docker volume create

mkdir -p /data1/Downloads
docker volume create --driver local --name hello --opt type=none --opt device=/data1/Downloads --opt o=uid=root,gid=root --opt o=bind
docker run -i -v hello:/Downloads ubuntu bash

দস্তাবেজটি একবার দেখুন https://docs.docker.com/engine/references/commandline/volume_create/


3
এসও-তে এই সমস্যাটি সম্পর্কে প্রচুর জবাব দেওয়ার চেষ্টা করা হয়েছিল, কিন্তু আসলে এটিই সহায়তা করেছিল। ধন্যবাদ!
পল

এটা তোলে অনুমতি .কিন্তু ভুল এখন মীমাংসিত যদি আমি এটা মাউন্ট voulme ???? @ cupen প্রকৃত অবস্থান মাউন্ট করার চেষ্টা করছি
কুনাল ভার্মা

1
@ কুনালভারমা হ্যাঁ আপনি যদি এটি পছন্দ না করেন তবে এখানে সহজ উত্তর। stackoverflow.com/a/31334443/4909388
cupen

4

আমার অনুরূপ সমস্যা ছিল, আমার হোস্টের ইউআইডি এবং কনটেইনার ব্যবহারকারীর ইউআইডি মধ্যে একটি অমিলের কারণে ঘটেছিল। ফিক্সটি হ'ল ব্যবহারকারীর ইউআইডি পাস করার অনুরোধ হিসাবে ডকার বিল্ড এবং একই ইউআইডি সহ ধারকটির ব্যবহারকারী তৈরি করা।

ডকারফাইলে:

ARG UID=1000
ENV USER="ubuntu"
RUN useradd -u $UID -ms /bin/bash $USER

বিল্ড স্টেপে:

docker build <path/to/Dockerfile> -t <tag/name> --build-arg UID=$UID

তারপরে, কন্টেইনারটি চালানো এবং ওপি অনুযায়ী আদেশগুলি আমাকে প্রত্যাশিত ফলাফল দিয়েছে।


1
আপনি যদি রান-টাইম না হওয়া পর্যন্ত ইউআইডি না জানেন? (আমি সহকারীদের জন্য কিছু ফাইল প্যাকেজ আপ করতে যা তাদের ফাইল সিস্টেমে আবার লেখার জন্য একটি চিত্র তৈরি করছি, তবে তাদের আলাদা ইউআইডি রয়েছে)। আমার ধারণা আমি এটিকে মূল এবং কেবলমাত্র অ্যাডুসারকে চালাতে পারব?
inger

দুর্ভাগ্যক্রমে আমার কাছে এর একটা ভাল উত্তর নেই। অন্য কারও যদি সমাধান থাকে তবে আমি এটিতে আগ্রহীও হব। আমি সন্দেহ করি যে ডকার এন্ট্রিপয়েন্ট কার্যকারিতা কোনও সমাধান দিতে পারে।
রোবকপ ৮87

0

আমি একটি ডেটা ধারক ব্যবহার করে এই সমস্যাটি সমাধান করেছি, এতে অ্যাপ্লিকেশন স্তর থেকে ডেটা আলাদা করার সুবিধাও রয়েছে। আপনি এটি এভাবে চালাতে পারেন:

docker run --volumes-from=<container-data-name> ubuntu

এই টিউটোরিয়ালটি তথ্য ধারকগুলির ব্যবহার সম্পর্কে একটি ভাল ব্যাখ্যা সরবরাহ করে।


-1

আমার পরিস্থিতিতে সমস্যা ছিল ভিন্ন। কেন আমি জানি না, কিন্তু এমনকি যদি হোস্ট ডিরেক্টরি ছিল chmod 777এটা চালানোর জন্য, ভিতরে Docker এটি হিসাবে দৃশ্যমান ছিল 755

ধারক ভিতরে চলমান sudo chmod 777 my_volume_dirএটি স্থির।


5
chmod 777খুব কমই কোনও কিছু ঠিক করে দেয়।
এরকি অ্যারিং

আমি দুঃখিত, কিন্তু আপনি বিষয়টি মিস করেছেন। মুল বক্তব্যটি হ'ল ভিতরে ধারক সুবিধাগুলি হ্রাস করা হয়েছিল এবং এটি বাইরে থেকে স্থির করা যায়নি।
কোডস্যান্ডউইচ

-2

sudo -s ম্যাকের জন্য আমার জন্য কৌশলটি করেছে


1
আপনি যদি নিম্নমানের হন, তবে একটি মন্তব্য করুন এবং কেন তা ব্যাখ্যা করুন। আমি ঠিক একই সমস্যার মুখোমুখি হয়েছি এবং sudo-s দ্বারা এটি সমাধান করতে সক্ষম হয়েছি।
নচিকেত জোশী

প্রতিটি ডকারের ছবিতে সুডো থাকে না এবং প্রতিটি দৃশ্যে এটি সম্ভব নয়।
সফট

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