ডকার পাত্রে কীভাবে সুডো ব্যবহার করবেন?


258

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

এই উদ্দেশ্যে একটি সাধারণ ডকফায়াইল রয়েছে:

FROM ubuntu:12.04

RUN useradd docker && echo "docker:docker" | chpasswd
RUN mkdir -p /home/docker && chown -R docker:docker /home/docker

USER docker
CMD /bin/bash

এই ধারকটি চালাচ্ছি, আমি ব্যবহারকারী 'ডকার' দিয়ে লগ ইন করব। যখন আমি sudo ব্যবহার করার চেষ্টা করি, কমান্ডটি পাওয়া যায় না। সুতরাং আমি আমার ডকফাইফিল ব্যবহার করে সুডো প্যাকেজটি ইনস্টল করার চেষ্টা করেছি

RUN apt-get install sudo

এটি প্যাকেজ sudo সনাক্ত করতে অক্ষম ফলাফল


ব্যবহারকারীকে কেবল সুডো গ্রুপ দিন। askubuntu.com/questions/7477/...
Regan

উত্তর:


240

এইমাত্র এটা পেলাম. রিগ্যান যেমন উল্লেখ করেছে, আমাকে ব্যবহারকারীকে sudoers গ্রুপে যুক্ত করতে হয়েছিল। তবে মূল কারণটি ছিল আমি সংগ্রহস্থলীর ক্যাশে আপডেট করতে ভুলে গিয়েছিলাম, সুতরাং অ্যাপো-গেটটি sudo প্যাকেজটি খুঁজে পেল না। এটা এখন কাজ করছে. এখানে সম্পূর্ণ কোডটি রয়েছে:

FROM ubuntu:12.04

RUN apt-get update && \
      apt-get -y install sudo

RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo

USER docker
CMD /bin/bash

8
Centos এ কাজ করে না। adduserকমান্ড ব্যবহারের সাহায্যে খুঁজে spitsuseradd
এমাদ

CentOS- এর জন্য, আপনি কোনও ব্যবহারকারী এবং গোষ্ঠী যুক্ত করতে পারেন, তারপরে একটি ধারালো ফাইল তৈরি করতে পারেন /etc/sudoers.d/এবং 440সেই ফাইলটিতে অনুমতিগুলি সেট করতে পারেন । তারপরে ব্যবহারকারীর সেন্টোস, and এবং তার বেশি বয়সের মধ্যে সুডো অ্যাক্সেস থাকবে। 5 আপনি যোগ করতে হবে #includedir /etc/sudoers.dএ নির্দেশ/etc/sudoers
FilBot3

আমার জন্য কাজ করে না। আমার এই ত্রুটিগুলি রয়েছে: ই: লক ফাইলটি / var / lib / অ্যাপ্ট / তালিকাগুলি / লক খুলতে পারেনি - খোলার (13: অনুমতি অস্বীকার করা হয়েছে) E: ডিরেক্টরি লক করতে অক্ষম / var / lib / apt /
list

1
এটি উবুন্টু 18.04 ডকার চিত্রের জন্য কাজ করছে বলে মনে হচ্ছে না
ভিজি

100

যখন sudo বা apt-get কোনওটিই পাত্রে পাওয়া যায় না, আপনি কমান্ডটি ব্যবহার করে রুট ব্যবহারকারী হিসাবে চলমান ধারকটিতেও যেতে পারেন

docker exec -u root -t -i container_id /bin/bash

গ্রহণযোগ্য উত্তরটি অনুরোধকৃত সমাধান দেয়, যদিও ওপি সম্ভবত এটি অর্জন করতে চায় এটির একটি আরও ভাল সমাধান। খুব কমপক্ষে, এটিই আমি উত্তরটি খুঁজছিলাম!
spikyjt

79

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

এখানে টিএল; ডিআর সংস্করণ:

RUN apt-get update \
 && apt-get install -y sudo

RUN adduser --disabled-password --gecos '' docker
RUN adduser docker sudo
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

USER docker

# this is where I was running into problems with the other approaches
RUN sudo apt-get update 

আমি এটির FROM node:9.3জন্য ব্যবহার করছিলাম তবে আমি সন্দেহ করি যে অনুরূপ অন্যান্য ধারক ঘাঁটিগুলিও কাজ করবে।


আমি ব্যবহার করছি ubuntu:bionic-20180724.1। আমি এই পদ্ধতির ব্যবহার করেছি তবে, উপরের পরে, এটি আমাকে আর একটি প্যাকেজ ইনস্টল করার অনুমতি দেয় না। আমি উপরের এক লাইন যোগ Dockerfileঅর্ডার দিয়ে একটি প্যাকেজ ইনস্টল করার জন্য: RUN apt-get install -y tree। যাইহোক, এটি আমাকে এই ত্রুটি বার্তা দিয়েছে:Step xxxx/xxxx : RUN apt-get install -y tree ---> Running in j5e6gsvwfafa Reading package lists... E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied) E: Unable to lock directory /var/lib/apt/lists/
এডেস্জ

1
@WR আমার মনে হয় আপনাকে পড়ার জন্য সেই লাইনটি পরিবর্তন করা দরকার RUN sudo apt-get install -y treeUSERঅন্য কিছুতে সেট করার পরে root, আপনাকে sudoযে কোনও আদেশের জন্য rootবিশেষাধিকারের প্রয়োজন রয়েছে তার জন্য ব্যবহার করতে হবে ।
এম স্কট ফোর্ড

আহ, ধন্যবাদ! মিস করেছেন। আমি মনে করি না যে sudoকোনও ডকফিলিতে অনুমতি দেওয়া হয়েছিল।
এডেজ

পারফেক্ট, ঠিক আমার যা দরকার ছিল।
অরিন একান্দেম

25

ইতিমধ্যে চলমান ধারক সহ যে কারও কাছে এই সমস্যা রয়েছে এবং তারা অগত্যা পুনর্নির্মাণ করতে চান না, নিম্নলিখিত কমান্ডটি রুট সুবিধাগুলি সহ চলমান ধারকটির সাথে সংযোগ স্থাপন করেছে:

docker exec -ti -u root container_name bash

আপনি এর আইডি ব্যবহার করে এটির নামের পরিবর্তে এটির মাধ্যমে এটি সংযুক্ত করতে পারেন:

docker ps -l

আপনার পরিবর্তনগুলি সংরক্ষণ করতে যাতে আপনি পরবর্তী কন্টেইনারটি চালু করার সময় তারা এখনও সেখানে থাকে (বা ডকার-কম্পোজ ক্লাস্টার):

docker commit container_id image_name

চলমান নয় এমন একটি ধারক শুরু করতে এবং রুট হিসাবে সংযোগ করতে:

docker run -ti -u root --entrypoint=/bin/bash image_id_or_name -s

চলমান ধারক থেকে অনুলিপি করতে:

docker cp <containerId>:/file/path/within/container /host/path/target

চিত্রটির একটি অনুলিপি রফতানি করতে:

docker save container | gzip > /dir/file.tar.gz

যা আপনি অন্য ডকার ইনস্টল করে এটি পুনরুদ্ধার করতে পারেন:

gzcat /dir/file.tar.gz | docker load

এটি অনেক তাড়াতাড়ি তবে সংকোচনের জন্য আরও বেশি জায়গা নেয়, এটি ব্যবহার করে:

docker save container | dir/file.tar

এবং:

cat dir/file.tar | docker load

17

আপনি যদি ধারকটির সাথে সংযোগ স্থাপন করতে চান এবং আমাদের ভাই "টোম জ্লুসকি" এর উপরের উত্তর হিসাবে প্রথমে অ্যাপ্লিকেশন
ব্যবহার করে কিছু ইনস্টল করতে চান

docker exec -u root -t -i container_id /bin/bash

তারপরে চেষ্টা করুন

রুন অ্যাপটি-গেট আপডেট বা অ্যাপটি-গেট 'আপনি যে কোনও কিছু চান'

এটি আমার সাথে কাজ করেছে আশা করি এটি সবার জন্য কার্যকর


5

যদি ধারকটির অভ্যন্তরে SUDO বা apt-get অ্যাক্সেসযোগ্য না হয় তবে আপনি চালিত ধারকটিতে নীচের বিকল্পটি ব্যবহার করতে পারেন।

docker exec -u root -it f83b5c5bf413 ash

" f83b5c5bf413" আমার ধারক আইডি এবং এখানে আমার টার্মিনাল থেকে উদাহরণ কাজ করছে:

এখানে চিত্র বর্ণনা লিখুন


3

আমি এখানে বেস-ইমেজ সহ একটি মূলবিহীন ব্যবহারকারীকে কীভাবে সেটআপ করব ubuntu:18.04:

RUN \
    groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
    sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
    echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
    echo "Customized the sudoers file for passwordless access to the foo user!" && \
    echo "foo user:";  su - foo -c id

উপরের কোডটি দিয়ে কী ঘটে:

  • ব্যবহারকারী এবং গ্রুপ fooতৈরি করা হয়।
  • ব্যবহারকারী fooউভয় fooএবং sudoগ্রুপে যুক্ত করা হয়েছে।
  • uidএবং gidএর মানে সেট করা 999
  • হোম ডিরেক্টরি সেট করা আছে /home/foo
  • শেল সেট করা আছে /bin/bash
  • sedকমান্ড ইনলাইন আপডেট করে /etc/sudoersঅনুমতি ফাইল fooএবং rootব্যবহারকারীদের passwordless এক্সেস sudoগ্রুপ।
  • sedকমান্ড অক্ষম#includedir নির্দেশ যে, এই ইনলাইন আপডেট ওভাররাইড করতে সাবডিরেক্টরি যে কোন ফাইল সম্ভব হবে।

2

আপনার যদি কন্টেনারটি রুট হিসাবে চলমান থাকে যা একটি স্ক্রিপ্ট চালায় (যা আপনি পরিবর্তন করতে পারবেন না) যাতে sudoকমান্ডটি অ্যাক্সেসের প্রয়োজন হয় , আপনি কেবল নিজের sudoমধ্যে একটি নতুন স্ক্রিপ্ট তৈরি করতে পারেন$PATH যা পাস কমান্ডকে কল করে।

যেমন আপনার ডকফাইলে:

RUN if type sudo 2>/dev/null; then \ 
     echo "The sudo command already exists... Skipping."; \
    else \
     echo -e "#!/bin/sh\n\${@}" > /usr/sbin/sudo; \
     chmod +x /usr/sbin/sudo; \
    fi

1
আপনি ব্যবহার করছেন Docker চিত্র (আমার ক্ষেত্রে উবুন্টু মধ্যে: 18.04) উপর নির্ভর করে, আপনি সরাতে প্রয়োজন হতে পারে -eথেকে echo। অন্যথায় এটি ফাইলটিতে উপস্থিত থাকবে, এটি অমূলক ব্যবহার করে।
stiller_leser

ঝরঝরে ধারণা, তবে মূল কমান্ড সুডো বিকল্পগুলি ব্যবহার করে যেমন এটি ব্যবহার করবে না sudo -E ls। এটি কার্যকর করার চেষ্টা করবে -E ls
উইসবাকি

2

এটি সমস্ত চিত্রের জন্য কাজ নাও করতে পারে তবে কিছু ছবিতে ইতিমধ্যে একটি রুট ব্যবহারকারী রয়েছে, যেমন জুপিটারহাব / সিঙ্গেল ব্যবহারকারীর চিত্র। এই চিত্রটি সহ এটি সহজ:

USER root
RUN sudo apt-get update

0

গৃহীত উত্তরের মতো নয় , আমি ব্যবহার করিusermod পরিবর্তে ।

ইতিমধ্যে ডকারে মূল হিসাবে লগ-ইন করা আছে এবং ধরে নিন যে "ফল" হ'ল আমি যে নতুন নন-রুট ব্যবহারকারীর নামটি যুক্ত করতে চাই, কেবল এই আদেশগুলি চালান:

apt update && apt install sudo
adduser fruit
usermod -aG sudo fruit

আপডেটের পরে চিত্রটি সংরক্ষণ করতে ভুলবেন না। ব্যবহারের docker psবর্তমান চলমান Docker এর <CONTAINER আইডি> পেতে এবং <ছবি>, তারপরে চালানোরdocker commit -m "added sudo user" <CONTAINER ID> <IMAGE> ডকার চিত্রটি সংরক্ষণ করতে দৌড়াবেন।

তারপরে পরীক্ষা করুন:

su fruit
sudo whoami

অথবা লঞ্চ ডকারের সময় সরাসরি অ-রুট ব্যবহারকারী হিসাবে সরাসরি লগইন দ্বারা পরীক্ষা (প্রথমে চিত্রটি সংরক্ষণ নিশ্চিত করুন) দ্বারা পরীক্ষা করুন:

docker run -it --user fruit <IMAGE>
sudo whoami

আপনি sudo -kপাসওয়ার্ড প্রম্পট টাইমস্ট্যাম্প পুনরায় সেট করতে ব্যবহার করতে পারেন :

sudo whoami # No password prompt
sudo -k # Invalidates the user's cached credentials
sudo whoami # This will prompt for password

0

উপনাম ব্যবহার করুন।

alias sudo=''

সহজ এবং দক্ষ। .Bashrc এ যুক্ত করতে ভুলবেন না যাতে আপনার শেলটি খোলার পরে এটি এখনও কাজ করে।

nano ~/.bashrc
alias sudo=''

যেহেতু ব্যবহারকারী ডকারে ডিফল্ট মূল , তাই 'উপেক্ষা' sudo কমান্ড সবচেয়ে সহজ উপায়।

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