ডকার ভাগ করা খণ্ডগুলির জন্য অনুমতিগুলি পরিচালনা করার (সেরা) উপায় কী?


345

আমি কিছু সময়ের জন্য ডকারের সাথে খেলছিলাম এবং অবিচ্ছিন্ন ডেটা নিয়ে কাজ করার সময় একই সমস্যাটি সন্ধান করতে থাকি।

আমি আমার তৈরি Dockerfileএবং একটি ভলিউম এক্সপোজ বা ব্যবহার --volumes-fromকরার আমার ধারক ভিতরে একটি হোস্ট ফোল্ডারের মাউন্ট

হোস্টের ভাগ করা ভলিউমে আমার কী অনুমতিগুলি প্রয়োগ করতে হবে?

আমি দুটি বিকল্প সম্পর্কে ভাবতে পারি:

  • এখনও অবধি আমি প্রত্যেককে পড়ার / লেখার অ্যাক্সেস দিয়েছি, তাই আমি ডকারের ধারক থেকে ফোল্ডারে লিখতে পারি।

  • হোস্ট থেকে পাত্রে ব্যবহারকারীদের মানচিত্র করুন, যাতে আমি আরও দানাদার অনুমতি নির্ধারণ করতে পারি। নিশ্চিত হওয়া যায় যদিও এটি সম্ভব এবং এটি সম্পর্কে খুব বেশি কিছু খুঁজে পায়নি। এখনও অবধি, আমি কেবল কিছু ব্যবহারকারীর হিসাবে ধারকটি চালাতে পারি: docker run -i -t -user="myuser" postgresতবে এই ব্যবহারকারীর আমার হোস্টের চেয়ে আলাদা ইউআইডি রয়েছে myuser, তাই অনুমতিগুলি কাজ করে না। এছাড়াও, আমি নিশ্চিত নই যে ব্যবহারকারীদের ম্যাপিংয়ে কিছু সুরক্ষা ঝুঁকি রয়েছে।

অন্য বিকল্প আছে?

আপনি কিভাবে ছেলেরা / gals এই সমস্যাটি নিয়ে কাজ করছেন?




1
আপনি কনটেইনার 42.com / 2014/11/18 / ডেটা- একা- কন্টেইনার- মডনেস দেখেছেন ?
ফিলিপ

এই মুহুর্তে, ডকার টিম নির্দিষ্ট ইউআইডি / জিড সহ ভলিউম হিসাবে হোস্ট-ডিরেক্টরিগুলি মাউন্ট করার নেটিভ সমাধান কার্যকর করার পরিকল্পনা করছে না। এই ইস্যুতে আমার মন্তব্য এবং জবাব দেখুন: github.com/docker/docker/issues/7198#issuecomment-230636074
কুইন কমেন্ডেন্ট

উত্তর:


168

আপডেট ২০১-0-০৩-০২ : ডকার ১.৯.০ হিসাবে, ডকার ভলিউমের নাম দিয়েছে যা কেবলমাত্র ডেটা-পাত্রে প্রতিস্থাপন করে । নীচের উত্তরটির সাথে সাথে আমার লিঙ্কযুক্ত ব্লগ পোস্টটির ডকারের অভ্যন্তরে থাকা ডেটা সম্পর্কে কীভাবে চিন্তা করা যায় সেই অর্থে এখনও মূল্য রয়েছে তবে ডেটা পাত্রে নয় বরং নীচে বর্ণিত প্যাটার্নটি প্রয়োগ করতে নামকরণকৃত ভলিউমগুলি ব্যবহার করার বিষয়টি বিবেচনা করুন।


আমি বিশ্বাস করি এটি সমাধানের মূল উপায়টি কেবলমাত্র ডেটা-পাত্রে ব্যবহার করা । এই পদ্ধতির সাথে, ভলিউম ডেটাতে সমস্ত অ্যাক্সেস এমন পাত্রে থাকে যা -volumes-fromডেটা ধারক ব্যবহার করে, তাই হোস্ট ইউআইডি / জিড কোনও ব্যাপার নয়।

উদাহরণস্বরূপ, ডকুমেন্টেশনে দেওয়া একটি ব্যবহারের ক্ষেত্রে ডেটা ভলিউম ব্যাক আপ করা হয়। এটি করার জন্য অন্য ধারকটি এর মাধ্যমে ব্যাকআপটি ব্যবহার করতে ব্যবহৃত হয় tarএবং এটি -volumes-fromভলিউম মাউন্ট করার জন্যও ব্যবহার করে। সুতরাং আমি মনে করি কুঁচকে যাওয়ার মূল বিষয়টি: সঠিক অনুমতি নিয়ে হোস্টের ডেটাতে কীভাবে অ্যাক্সেস পাওয়া যায় সে সম্পর্কে চিন্তাভাবনা করার পরিবর্তে, আপনার যা প্রয়োজন - ব্যাকআপ, ব্রাউজিং ইত্যাদি কীভাবে করবেন তা নিয়ে ভাবুন - অন্য ধারক মাধ্যমে container । পাত্রে তাদের নিজেরাই সামঞ্জস্যপূর্ণ ইউআইডি / গিডগুলি ব্যবহার করা দরকার তবে তাদের হোস্টের কোনও কিছুতে মানচিত্রের দরকার নেই, যার ফলে বহনযোগ্য remaining

এটি আমার জন্যও তুলনামূলকভাবে নতুন তবে আপনার যদি কোনও নির্দিষ্ট ব্যবহারের ক্ষেত্রে মন্তব্য করতে দ্বিধা বোধ হয় এবং আমি উত্তরের প্রসারিত করার চেষ্টা করব।

আপডেট : মন্তব্যগুলিতে প্রদত্ত ব্যবহারের ক্ষেত্রে আপনার some/graphiteগ্রাফাইট চালানোর জন্য একটি চিত্র some/graphitedataএবং ডেটা ধারক হিসাবে একটি চিত্র থাকতে পারে । সুতরাং, বন্দরগুলি এবং এগুলি উপেক্ষা করে Dockerfileচিত্রের চিত্রটি some/graphitedataহ'ল কিছু:

FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
  && useradd -r -g graphite graphite
RUN mkdir -p /data/graphite \
  && chown -R graphite:graphite /data/graphite
VOLUME /data/graphite
USER graphite
CMD ["echo", "Data container for graphite"]

ডেটা ধারক তৈরি এবং তৈরি করুন:

docker build -t some/graphitedata Dockerfile
docker run --name graphitedata some/graphitedata

some/graphiteDockerfile একই ইউআইডি / gids পাওয়া উচিত, সুতরাং এটি ভালো কিছু চেহারা পারে:

FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
  && useradd -r -g graphite graphite
# ... graphite installation ...
VOLUME /data/graphite
USER graphite
CMD ["/bin/graphite"]

এবং এটি নিম্নলিখিত হিসাবে চালানো হবে:

docker run --volumes-from=graphitedata some/graphite

ঠিক আছে, এখন এটি আমাদের গ্রাফাইট ধারক এবং কেবলমাত্র সঠিক ব্যবহারকারী / গোষ্ঠীর সাথে সম্পর্কিত ডেটা-কনটেইনার সরবরাহ করে (নোট করুন যে আপনি some/graphiteধারকটি পুনরায় ব্যবহার করতে পারেন , চালানোর সময় এন্ট্রিপিং / সেন্টিমিডি ওভাররাইড করে তবে সেগুলি যেমন রয়েছে পৃথক চিত্র আইএমও পরিষ্কার হয়)।

এখন, ধরুন আপনি ডেটা ফোল্ডারে কিছু সম্পাদনা করতে চান। সুতরাং হোস্টটিতে ভলিউম মাউন্ট করা এবং এটি সম্পাদনা করার পরিবর্তে সেই কাজটি করার জন্য একটি নতুন ধারক তৈরি করুন। এটি কল করতে দেয় some/graphitetoolssome/graphiteচিত্রের মতো উপযুক্ত ব্যবহারকারী / গোষ্ঠী তৈরি করতে দেয় ।

FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
  && useradd -r -g graphite graphite
VOLUME /data/graphite
USER graphite
CMD ["/bin/bash"]

ডকফাইফিলের কাছ থেকে some/graphiteবা উত্তরাধিকার সূত্রে some/graphitedataআপনি এই ডিআরওয়াই তৈরি করতে পারবেন বা একটি নতুন চিত্র তৈরি করার পরিবর্তে বিদ্যমান বিদ্যমানগুলির মধ্যে একটিটিকে পুনরায় ব্যবহার করুন (প্রয়োজনীয় হিসাবে অ্যান্ট্রাইপিং / সেন্টিমিটার ওভাররাইড)।

এখন, আপনি কেবল চালান:

docker run -ti --rm --volumes-from=graphitedata some/graphitetools

এবং তারপর vi /data/graphite/whatever.txt। এটি নিখুঁতভাবে কাজ করে কারণ সমস্ত পাত্রে uid / gid এর সাথে মিলে একই গ্রাফাইট ব্যবহারকারী রয়েছে।

যেহেতু আপনি মাউন্ট কখনো /data/graphiteহোস্ট থেকে, আপনি কি দেখেন না কিভাবে হোস্ট ইউআইডি / gid ইউআইডি / gid ভিতরে সংজ্ঞায়িত মানচিত্র graphiteএবং graphitetoolsপাত্রে। এই ধারকগুলি এখন যে কোনও হোস্টে স্থাপন করা যেতে পারে এবং তারা নিখুঁতভাবে কাজ চালিয়ে যাবে।

এ সম্পর্কে ঝরঝরে বিষয় হ'ল graphitetoolsসমস্ত ধরণের দরকারী ইউটিলিটি এবং স্ক্রিপ্ট থাকতে পারে, যা আপনি এখন একটি বহনযোগ্য পদ্ধতিতে স্থাপন করতে পারেন।

আপডেট 2 : এই উত্তরটি লেখার পরে, আমি এই পদ্ধতির সম্পর্কে আরও একটি সম্পূর্ণ ব্লগ পোস্ট লেখার সিদ্ধান্ত নিয়েছি । আমি আসা করি এটা সাহায্য করবে.

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


35
আমি আশঙ্কা করছি এটি কোনও সমাধান নয় কারণ আপনার কেবলমাত্র ডেটা পাত্রেই একই সমস্যা থাকবে। দিনের শেষে, এই ধারকগুলি হোস্টের কাছ থেকে ভাগ করা ভলিউম ব্যবহার করবে, সুতরাং আপনাকে এখনও সেই ভাগ করা ফোল্ডারে অনুমতিগুলি পরিচালনা করতে হবে।
Xabs

2
মনে রাখবেন যে আমার হোস্ট থেকে ডেটা ফোল্ডারটি সম্পাদনা করার প্রয়োজন হতে পারে (যেমন: একটি পরীক্ষার গ্রাফাইট কী মুছুন, আমার JIRA টেস্ট হোম ফোল্ডারটি মুছুন বা সর্বশেষ প্রোডাকশন ব্যাকআপের সাথে আপডেট করুন ...)। আপনার মন্তব্য থেকে আমি যতদূর বুঝতে পারি, আমার তৃতীয় ধারকটির মাধ্যমে জিরআ ডেটা আপডেট করার মতো জিনিস করা উচিত। যে কোনও ক্ষেত্রে, আপনি কোনও নতুন ডেটা ফোল্ডারে কোন অনুমতিগুলি প্রয়োগ করবেন /data/newcontainer? আমি ধরে নিই যে আপনি dockerমূল হিসাবে চালাচ্ছেন (এটি কি সম্ভব না?) এছাড়াও, ডেটা সরাসরি মূল পাত্রে বা কেবলমাত্র একটি ডেটা-পাত্রের মাধ্যমে মাউন্ট করা থাকলে সেই অনুমতিগুলির মধ্যে কোনও পার্থক্য রয়েছে কি?
Xabs

2
আপনার বিস্তৃত উত্তরের জন্য ধন্যবাদ। সুযোগ পাওয়ার সাথে সাথে এটি পরীক্ষা করে নেবে। এছাড়াও, চমৎকার রেফারেন্স উভয় আপনার ব্লগ পোস্ট এবং প্রায় এক তথ্য পাত্রে জন্য ন্যূনতম চিত্র ব্যবহার
Xabs

3
এই পদ্ধতির একমাত্র সমস্যাটি ভুলভাবে একটি ধারক মুছতে খুব সহজ। এটি যদি আপনার ডেটা ধারক হয়ে থাকে তবে ভাবুন। আমি মনে করি (সিএমআইআইডাব্লু) তথ্যটি /var/lib/dockerকোথাও কোথাও থাকবে তবে এখনও একটি বিশাল ব্যথা
lolki

3
"আপনি কেবল" তথ্যসূত্র "টিকে "রেফারেন্স / হ্যান্ডেল" হিসাবে ব্যবহার করতে পারেন এবং একটি প্রবেশপথের মধ্যে আবদ্ধ হয়ে অন্য পাত্রে মালিকানা / অনুমতিগুলি সেট করতে পারেন "... @ রমন: এটি এমন অংশ যা অবশেষে আমাকে অনেক অনুমতি ইস্যু না থাকার পরে সংরক্ষণ করেছিল saved খুঁজে বের করা. এন্ট্রিপয়েন্ট স্ক্রিপ্ট ব্যবহার করা এবং এতে অনুমতি নির্ধারণ করা আমার পক্ষে কাজ করে। আপনার বিস্তৃত ব্যাখ্যার জন্য ধন্যবাদ। এটি এখন পর্যন্ত ওয়েবে আমি খুঁজে পাওয়া সেরা।
ভ্যান্ডারস্টাইজ

59

অফিসিয়াল রেডিস ইমেজে এবং সমস্ত অফিশিয়াল ইমেজে একটি খুব মার্জিত সমাধান দেখা যায় ।

ধাপে ধাপে প্রক্রিয়া বর্ণিত:

  • অন্য কিছুর আগে redis ব্যবহারকারী / গোষ্ঠী তৈরি করুন

ডকফাইফাইল মন্তব্যগুলিতে যেমন দেখা যায়:

যাইহোক নির্ভরতা যুক্ত থাকুক না কেন, তাদের আইডিগুলি ধারাবাহিকভাবে নির্ধারিত হবে তা নিশ্চিত করতে প্রথমে আমাদের ব্যবহারকারী এবং গোষ্ঠী যুক্ত করুন

মূল ব্যবহারকারী থেকে সহজ পদক্ষেপ নেওয়ার জন্য gosu su/ এর বিকল্প sudofor (রেডিস সর্বদা redisব্যবহারকারীর সাথে চালিত হয় )

  • /dataভলিউম কনফিগার করুন এবং এটিকে ওয়ার্কডির হিসাবে সেট করুন

VOLUME /dataকমান্ডটি দিয়ে / ডেটা ভলিউমটি কনফিগার করে এখন আমাদের একটি পৃথক ভলিউম রয়েছে যা হয় ডকার ভলিউম হতে পারে বা হোস্ট ডিরের সাথে বাঁধাই করা যায়।

এটিকে ওয়ার্কডির ( WORKDIR /data) হিসাবে কনফিগার করা এটিকে ডিফল্ট ডিরেক্টরি হিসাবে তৈরি করে যেখানে আদেশগুলি কার্যকর করা হয়।

  • ডকার-এন্ট্রিপয়েন্ট ফাইল যুক্ত করুন এবং এটি ডিফল্ট সিএমডি রেডিস-সার্ভারের সাথে ENTRYPOINT হিসাবে সেট করুন

এর অর্থ হ'ল সমস্ত ধারক মৃত্যুদণ্ড ডকার-এন্ট্রিপয়েন্ট স্ক্রিপ্টের মধ্য দিয়ে চলবে এবং ডিফল্টরূপে চালিত কমান্ডটি redis-server হয়।

docker-entrypointথেকে বর্তমান ডিরেক্টরির (/ ডেটা) এবং ধাপে-ডাউন মালিকানা পরিবর্তন: একটি স্ক্রিপ্ট যে একটি সহজ ফাংশন নেই rootকরার redisব্যবহারকারী চালানোর জন্য redis-server। (যদি সম্পাদিত কমান্ডটি পুনরায় সার্ভার না হয় তবে এটি সরাসরি কমান্ডটি চালাবে))

এটি নিম্নলিখিত প্রভাব আছে

যদি / ডেটা ডিরেক্টরি হোস্টের সাথে বাইন্ড-মাউন্ট করা থাকে তবে ডকার-এন্ট্রিপয়েন্টটি ব্যবহারকারীর আওতায় রেডিস-সার্ভার চালানোর আগে ব্যবহারকারীর অনুমতি প্রস্তুত করবে redis

এটি আপনাকে স্বাচ্ছন্দ্য দেয় যে কোনও ভলিউম কনফিগারেশনের অধীনে ধারকটি চালানোর জন্য শূন্য-সেটআপ রয়েছে।

অবশ্যই যদি আপনাকে বিভিন্ন চিত্রের মধ্যে ভলিউম ভাগ করতে হয় তবে আপনার অবশ্যই নিশ্চিত করতে হবে যে তারা একই ব্যবহারকারী / গ্রুপিড ব্যবহার করেছে অন্যথায় সর্বশেষতম ধারকটি পূর্বের চিত্রের ব্যবহারকারীর অনুমতিগুলি হাইজ্যাক করবে।


11
গৃহীত উত্তরটি তথ্যবহুল, তবে এটি আমাকে এই উত্তরটি সন্ধানের অনুমতি সহ এক সপ্তাহব্যাপী হতাশার পথে ফেলেছে যা আসলে সমস্যাটি সমাধানের এক সাধারণ উপায় সরবরাহ করে।
m0meni

3
এখানে খুব সুন্দরভাবে ব্যাখ্যা করা হয়েছে: denibertovic.com/posts/handling-permission-with-docker-volume
খেরাউদ

তাই? আমি কীভাবে ভিতরে ডকার থেকে ভলিউম লিখনযোগ্য করব? chownএটা ENTRYPOINTস্ক্রিপ্ট ভিতরে ?
ঘেরম্যান

34

এটি বেশিরভাগ পরিস্থিতিতে সবচেয়ে ভাল উপায় নয় , তবে এটি এখনও উল্লেখ করা হয়নি তাই সম্ভবত এটি কাউকে সহায়তা করবে।

  1. মাউন্ট হোস্ট ভলিউম বাঁধুন

    Host folder FOOBAR is mounted in container /volume/FOOBAR

  2. আপনার আগ্রহী ভলিউমের জিআইডি খুঁজতে আপনার ধারকটির স্টার্টআপ স্ক্রিপ্টটি সংশোধন করুন

    $ TARGET_GID=$(stat -c "%g" /volume/FOOBAR)

  3. আপনার ব্যবহারকারী এই জিআইডি সহ কোনও গ্রুপের অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন (আপনাকে একটি নতুন গ্রুপ তৈরি করতে হতে পারে)। এই উদাহরণের জন্য আমি আমার সফ্টওয়্যারটি ধারকটির nobodyভিতরে থাকা অবস্থায় ব্যবহারকারী হিসাবে চালানোর ভান করব , তাই আমি নিশ্চিত করতে চাই যে nobodyএকটি গ্রুপের আইডি সমান একটি গ্রুপের অন্তর্গতTARGET_GID

  EXISTS=$(cat /etc/group | grep $TARGET_GID | wc -l)

  # Create new group using target GID and add nobody user
  if [ $EXISTS == "0" ]; then
    groupadd -g $TARGET_GID tempgroup
    usermod -a -G tempgroup nobody
  else
    # GID exists, find group name and add
    GROUP=$(getent group $TARGET_GID | cut -d: -f1)
    usermod -a -G $GROUP nobody
  fi

আমি এটি পছন্দ করি কারণ আমি সহজেই আমার হোস্ট ভলিউমে গ্রুপ অনুমতিগুলি সংশোধন করতে পারি এবং জানতে পারি যে আপডেট হওয়া অনুমতিগুলি ডকারের ধারকের ভিতরে প্রয়োগ হয়। এটি আমার হোস্ট ফোল্ডার / ফাইলগুলিতে কোনও অনুমতি বা মালিকানা পরিবর্তন ছাড়াই ঘটে যা আমাকে খুশি করে।

আমি এটি পছন্দ করি না কারণ এটি ধরে নিয়েছে যে আপনি চান এমন একটি জিআইডি ব্যবহার করে এমন পাত্রে অভ্যন্তরীন একটি স্বেচ্ছাসেবী দলের সাথে নিজেকে যুক্ত করার কোনও বিপদ নেই। এটি USERডকফাইফাইলের একটি ধারা সহ ব্যবহার করা যাবে না (যদি না যে ব্যবহারকারীর রুট সুবিধাগুলি না মনে করি)। এছাড়াও, এটি হ্যাক জব চিৎকার করে ;-)

আপনি যদি কৃপণ হতে চান তবে আপনি অবশ্যই এটি বিভিন্ন উপায়ে প্রসারিত করতে পারেন - যেমন কোনও সাবফিল, একাধিক খণ্ড, ইত্যাদিতে সমস্ত গোষ্ঠীর সন্ধান করুন etc.


4
এটি কি মাউন্ট ভলিউম থেকে ফাইলগুলি পড়তে লক্ষ্য করা যায় ? যারা ডকার পাত্রে তৈরি করেছেন তাদের চেয়ে অন্য কোনও ব্যক্তির মালিকানা ছাড়াই ফাইল লেখার জন্য আমি সমাধানের সন্ধান করছি।
18:55

আমি আগস্ট 15 এর পর থেকে এই পদ্ধতির ব্যবহার করছি। সব ঠিক ছিল। ধারকটির ভিতরে তৈরি ফাইলগুলির অনুমতিগুলি পৃথক ছিল। উভয়ই, ব্যবহারকারীর (ধারকটির ভিতরে এবং বাইরে) তাদের ফাইলগুলির মালিকানা রয়েছে তবে উভয়ই তাদের অ্যাক্সেসটি পড়তে পেরেছিলেন কারণ তারা এই সমাধানটির দ্বারা তৈরি একই গোষ্ঠীর অন্তর্ভুক্ত ছিল। যখন কোনও ব্যবহারের ক্ষেত্রে সাধারণ ফাইলগুলিতে লেখার অ্যাক্সেস চাপিয়ে দেওয়া হয়েছিল তখন সমস্যাটি শুরু হয়েছিল। বৃহত্তর সমস্যাটি ছিল ভাগ করা ভলিউমের গিট ফাইল (এটি একই উত্পাদন প্রসঙ্গে ডেভ উত্স ফাইলগুলি পরীক্ষা করার জন্য একটি ভলিউম)। গিট ভাগ করা কোডটিতে অ্যাক্সেস সমস্যা সম্পর্কে সতর্ক করতে শুরু করেছে।
yucer

আমি মনে করি এর জন্য আরও ভাল গ্রিপ ব্যবহার $TARGET_GIDকরা উচিত grep ':$TARGET_GID:', অন্যথায় যদি ধারকটি থাকে, যেমন গ্রিড 10001 এবং আপনার হোস্টটি 1000, এই চেকটি পাস হয়ে যাবে তবে এটি করা উচিত নয়।
রবহডসন

16

ঠিক আছে, এটি এখন ডকার ইস্যু # 7198 এ অনুসন্ধান করা হচ্ছে

আপাতত, আমি আপনার দ্বিতীয় বিকল্পটি ব্যবহার করে এটি মোকাবেলা করছি:

হোস্ট থেকে পাত্রে ব্যবহারকারীদের মানচিত্র

Dockerfile

#=======
# Users
#=======
# TODO: Idk how to fix hardcoding uid & gid, specifics to docker host machine
RUN (adduser --system --uid=1000 --gid=1000 \
        --home /home/myguestuser --shell /bin/bash myguestuser)

CLI

# DIR_HOST and DIR_GUEST belongs to uid:gid 1000:1000
docker run -d -v ${DIR_HOST}:${DIR_GUEST} elgalu/myservice:latest

আপডেট আমি বর্তমানে হ্যামি উত্তরের দিকে আরও ঝুঁকছি


1
কমান্ড ব্যবহার id -u <username>, id -g <username>, id -G <username>পরিবর্তে ইউজার আইডি এবং একটি নির্দিষ্ট ব্যবহারকারীর গোষ্ঠী ID পেতে
lolski


15
এটি হোস্ট জুড়ে ধারক বহনযোগ্যতা ধ্বংস করে।
রমন

2
ডকার ইস্যু # 7198 এই সিদ্ধান্তে পৌঁছেছে যে তারা এর জন্য কোনও স্থানীয় সমাধান বাস্তবায়ন করবে না। আমার মন্তব্য দেখুন github.com/docker/docker/issues/7198#issuecomment-230636074
কুইন কমেন্ডেন্ট


12

আপনার মত একই, আমি হোস্ট থেকে ডকারের পাত্রে ব্যবহারকারী / গোষ্ঠীগুলির মানচিত্র তৈরির একটি উপায় খুঁজছিলাম এবং এটি এখন পর্যন্ত আমি সবচেয়ে সংক্ষিপ্ততম পথটি পেয়েছি:

  version: "3"
    services:
      my-service:
        .....
        volumes:
          # take uid/gid lists from host
          - /etc/passwd:/etc/passwd:ro
          - /etc/group:/etc/group:ro
          # mount config folder
          - path-to-my-configs/my-service:/etc/my-service:ro
        .....

এটি আমার ডকার-কমপোজ.আইএমএল থেকে একটি নির্যাস।

ধারণাটি হ'ল (কেবল পঠন মোডে) ব্যবহারকারী / গোষ্ঠীগুলির তালিকাটি হোস্ট থেকে কনটেইনারগুলিতে তালিকাভুক্ত করা হবে সুতরাং ধারকটি শুরু হওয়ার পরে হোস্টের সাথে একই uid-> ব্যবহারকারীর নাম (পাশাপাশি গোষ্ঠীগুলির জন্য) মিল থাকবে। এখন আপনি ধারকটির ভিতরে আপনার পরিষেবার জন্য ব্যবহারকারী / গোষ্ঠী সেটিংস কনফিগার করতে পারেন যেন এটি আপনার হোস্ট সিস্টেমে কাজ করে।

আপনি যখন নিজের ধারকটিকে অন্য হোস্টে স্থানান্তরিত করার সিদ্ধান্ত নেবেন তখন আপনাকে সেবার হোস্টটিতে থাকা যাবতীয় সার্ভিস কনফিগারেশনের ফাইলের ব্যবহারকারীর নাম পরিবর্তন করতে হবে।


এটি খুব দুর্দান্ত উত্তর, খুব সহজেই যদি আপনি এমন কোনও ধারক চালাতে চান যা কোনও সিস্টেমের বাকী অংশটি উন্মুক্ত না করে কোনও বেস সিস্টেমে ফাইলগুলি পরিচালনা করে।
আইক্রিটো

এটি আমার প্রিয় উত্তর। এছাড়াও, আমি ডকার রান কমান্ডের সাথে অন্য কোথাও অনুরূপ প্রস্তাব পেয়েছি যেখানে আপনি আপনার বর্তমান ব্যবহারকারীর নাম / গোষ্ঠীগুলির মাধ্যমে পাস করেন -u $( id -u $USER ):$( id -g $USER )এবং আপনাকে আর ব্যবহারকারীর নাম নিয়ে চিন্তা করতে হবে না। এটি স্থানীয় ডেভ পরিবেশের জন্য ভাল কাজ করে যেখানে আপনি ফাইলগুলি তৈরি করতে চান (উদাহরণস্বরূপ বাইনারিগুলি) যা আপনি ডিফল্টরূপে / পড়ার লেখার অ্যাক্সেস পেয়েছেন।
ম্যাথহেচামিংসিংস 1616

5

এখানে এমন একটি পদ্ধতি রয়েছে যা এখনও কেবলমাত্র ডেটা-পাত্রে ব্যবহার করে তবে এটিকে অ্যাপ্লিকেশন ধারক (একইভাবে uid / gid থাকার ক্ষেত্রে) এর সাথে সিঙ্ক করার প্রয়োজন নেই।

সম্ভবতঃ, আপনি লগইন শেল ছাড়াই ধারকটিতে একটি অ-মূল $ USER হিসাবে কিছু অ্যাপ চালাতে চান।

ডকফাইফিল এ:

RUN useradd -s /bin/false myuser

# Set environment variables
ENV VOLUME_ROOT /data
ENV USER myuser

...

ENTRYPOINT ["./entrypoint.sh"]

তারপরে, এন্ট্রিপয়েন্ট.শতে:

chown -R $USER:$USER $VOLUME_ROOT
su -s /bin/bash - $USER -c "cd $repo/build; $@"

5

সুরক্ষিত এবং ডকারের ধারকটির জন্য রুট পরিবর্তনের জন্য একটি ডকার হোস্ট ব্যবহার --uidmapএবং --private-uidsবিকল্পগুলি চেষ্টা করে

https://github.com/docker/docker/pull/4572#issuecomment-38400893

--cap-dropসুরক্ষার জন্য আপনি ডকার পাত্রে বেশ কয়েকটি ক্ষমতা ( ) সরিয়ে ফেলতে পারেন

http://opensource.com/business/14/9/security-for-docker

আপডেট আপডেট আসা উচিতdocker > 1.7.0

আপডেট সংস্করণ 1.10.0(2016-02-04) --userns-remapপতাকা যুক্ত করুন https://github.com/docker/docker/blob/master/CHANGELOG.md# সুরক্ষা ২২


আমি Docker চলছি 1.3.2 বিল্ড 39fa2fa (সর্বশেষ) এবং কোন ট্রেস দেখতে --uidmapকিংবা --private-uidsঅপশন। দেখে মনে হচ্ছে PR টি এটি তৈরি করে নি এবং একত্রিত হয়নি।
লিও গ্যালুচি

এটি মূলতে একীভূত হয় না, আপনি চাইলে এটি কীভাবে প্যাচটি ব্যবহার করতে পারেন। এখন কেবলমাত্র সম্ভাব্য কিছু ক্ষমতা সীমাবদ্ধ করুন এবং অ মূল ব্যবহারকারীর কাছ থেকে পাত্রে অ্যাপ্লিকেশন চালান।
অমাউন্ট

জুন ২০১৫ এবং আমি এই ডকারে একীভূত দেখতে পাচ্ছি না 1.6.2 আপনার উত্তরটি এখনও বৈধ?
লিও গ্যালুচি

1
ইস্যু এখনও খোলা আছে। বিকাশকারীদের 1.7 সংস্করণে সমর্থন যোগ করা উচিত। (--root বিকল্প) github.com/docker/docker/pull/12648
আনমাউন্ট

2
দেখে মনে হচ্ছে বিকাশকারীরা আবার এই কার্যকারিতা সহ রিলিজটি সরিয়ে নিয়েছে। ডকার বিকাশকারী "আইসক্রিম" বলে "We apparently do have so some of conflicting designs between libnetwork and user namespaces ... and something we'd like to get in for 1.8.0. So don't think we're dropping this, we're definitely going to take a break after all these, and see how we need to reconsider the current design and integration of libnetwork to make this possible. Thanks!" github.com/docker/docker/pull/12648 সুতরাং আমি মনে করি আমাদের পরবর্তী স্থিতিশীল সংস্করণটি অপেক্ষা করা উচিত।
সর্বশেষ

4

আমার পদ্ধতিটি হ'ল বর্তমান ইউআইডি / জিআইডি সনাক্ত করা, তারপরে ধারকের ভিতরে এমন ব্যবহারকারী / গোষ্ঠী তৈরি করা এবং তার অধীনে স্ক্রিপ্টটি সম্পাদন করা। ফলস্বরূপ তিনি তৈরি করবেন এমন সমস্ত ফাইল হোস্টের ব্যবহারকারীর সাথে মিলবে (যা স্ক্রিপ্ট):

# get location of this script no matter what your current folder is, this might break between shells so make sure you run bash
LOCAL_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# get current IDs
USER_ID=$(id -u)
GROUP_ID=$(id -g)

echo "Mount $LOCAL_DIR into docker, and match the host IDs ($USER_ID:$GROUP_ID) inside the container."

docker run -v $LOCAL_DIR:/host_mount -i debian:9.4-slim bash -c "set -euo pipefail && groupadd -r -g $GROUP_ID lowprivgroup && useradd -u $USER_ID lowprivuser -g $GROUP_ID && cd /host_mount && su -c ./runMyScriptAsRegularUser.sh lowprivuser"

3

বেস ইমেজ

এই চিত্রটি ব্যবহার করুন: https://hub.docker.com/r/reduardo7/docker-host-user

অথবা

গুরুত্বপূর্ণ: এটি হোস্ট জুড়ে ধারক বহনযোগ্যতা ধ্বংস করে

1) init.sh

#!/bin/bash

if ! getent passwd $DOCKDEV_USER_NAME > /dev/null
  then
    echo "Creating user $DOCKDEV_USER_NAME:$DOCKDEV_GROUP_NAME"
    groupadd --gid $DOCKDEV_GROUP_ID -r $DOCKDEV_GROUP_NAME
    useradd --system --uid=$DOCKDEV_USER_ID --gid=$DOCKDEV_GROUP_ID \
        --home-dir /home --password $DOCKDEV_USER_NAME $DOCKDEV_USER_NAME
    usermod -a -G sudo $DOCKDEV_USER_NAME
    chown -R $DOCKDEV_USER_NAME:$DOCKDEV_GROUP_NAME /home
  fi

sudo -u $DOCKDEV_USER_NAME bash

2) Dockerfile

FROM ubuntu:latest
# Volumes
    VOLUME ["/home/data"]
# Copy Files
    COPY /home/data/init.sh /home
# Init
    RUN chmod a+x /home/init.sh

3) রান.শ

#!/bin/bash

DOCKDEV_VARIABLES=(\
  DOCKDEV_USER_NAME=$USERNAME\
  DOCKDEV_USER_ID=$UID\
  DOCKDEV_GROUP_NAME=$(id -g -n $USERNAME)\
  DOCKDEV_GROUP_ID=$(id -g $USERNAME)\
)

cmd="docker run"

if [ ! -z "${DOCKDEV_VARIABLES}" ]; then
  for v in ${DOCKDEV_VARIABLES[@]}; do
    cmd="${cmd} -e ${v}"
  done
fi

# /home/usr/data contains init.sh
$cmd -v /home/usr/data:/home/data -i -t my-image /home/init.sh

4) দিয়ে তৈরি করুন docker

৪) রান!

sh run.sh

0

আমার নির্দিষ্ট ক্ষেত্রে, আমি নোড ডকার চিত্র সহ আমার নোড প্যাকেজটি তৈরি করার চেষ্টা করছিলাম যাতে আমাকে ডিপ্লোয়মেন্ট সার্ভারে এনপিএম ইনস্টল করতে না হয়। কনটেইনারের বাইরে এবং হোস্ট মেশিনে, আমি খুব ভালভাবে কাজ করেছিলাম, আমি নোড ডকোয়ার ইমেজ তৈরি করা নোড_মডিউল ডিরেক্টরিতে একটি ফাইল স্থানান্তরিত করার চেষ্টা করেছি, যার কাছে আমার অনুমতি অস্বীকার করা হয়েছিল কারণ এটি মূলের মালিকানাধীন ছিল। আমি বুঝতে পারি যে আমি হোস্ট মেশিনে ধারকটির বাইরে ডিরেক্টরিটি অনুলিপি করে কাজ করতে পারি। ডকার ডক্সের মাধ্যমে ...

স্থানীয় মেশিনে অনুলিপি করা ফাইলগুলি ইউআইডি: জিআইডি দিয়ে তৈরি করা হয়েছে যা ডকার সিপি কমান্ডটি ব্যবহার করেছিল।

এই বাশ কোডটি আমি ডকারের ধারক এবং এর মাধ্যমে তৈরি ডিরেক্টরিটির মালিকানা পরিবর্তন করতে ব্যবহার করি।

NODE_IMAGE=node_builder
docker run -v $(pwd)/build:/build -w="/build" --name $NODE_IMAGE node:6-slim npm i --production
# node_modules is owned by root, so we need to copy it out 
docker cp $NODE_IMAGE:/build/node_modules build/lambda 
# you might have issues trying to remove the directory "node_modules" within the shared volume "build", because it is owned by root, so remove the image and its volumes
docker rm -vf $NODE_IMAGE || true

প্রয়োজনে আপনি দ্বিতীয় ডকারের ধারক সহ ডিরেক্টরিটি সরিয়ে ফেলতে পারেন।

docker run -v $(pwd)/build:/build -w="/build" --name $RMR_IMAGE node:6-slim rm -r node_modules

0

ডকার হোস্ট এবং ডকার ধারক মধ্যে ফোল্ডার ভাগ করতে, কমান্ড নীচে চেষ্টা করুন

$ ডকার রান-ভি "$ (পিডব্লিউডি): $ (পিডব্লিউডি)" -আই-উবুন্টু

-V পতাকা বর্তমান চলমান ডিরেক্টরিটিকে ধারক মধ্যে স্থাপন করে। যখন বাইন্ড-মাউন্ট ভলিউমের হোস্ট ডিরেক্টরি উপস্থিত না থাকে, ডকার স্বয়ংক্রিয়ভাবে আপনার জন্য হোস্টে এই ডিরেক্টরিটি তৈরি করবে,

তবে আমাদের এখানে 2 টি সমস্যা রয়েছে:

  1. আপনি যদি অ-রুট ব্যবহারকারী হন তবে আপনি মাউন্ট করা ভলিউমে লিখতে পারবেন না কারণ ভাগ করা ফাইলটি হোস্টের অন্য ব্যবহারকারীর মালিকানা পাবে,
  2. আপনার পাত্রগুলির অভ্যন্তরে প্রক্রিয়াটি রুট হিসাবে চালানো উচিত নয় তবে আপনি যদি কিছু হার্ড-কোডেড ব্যবহারকারীর মতো চালান তবে এটি এখনও আপনার ল্যাপটপে / জেনকিনসের ব্যবহারকারীর সাথে মেলে না,

সমাধান:

ধারক: 'পরীক্ষক' বলে একটি ব্যবহারকারী তৈরি করুন, ডিফল্টরূপে ব্যবহারকারী আইডি 1000 থেকে শুরু হবে,

হোস্ট: গ্রুপ আইডি 1000 সহ 'টেস্টগ্রুপ' বলুন এবং একটি গ্রুপকে নতুন গ্রুপে পরীক্ষা করুন (টেস্টগ্রুপ)


-5

আপনি যদি ডকার রচনাটি ব্যবহার করে থাকেন তবে চালিত মোডে ধারকটি শুরু করুন:

wordpress:
    image: wordpress:4.5.3
    restart: always
    ports:
      - 8084:80
    privileged: true

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