एक डॉक कंटेनर के अंदर सूडो का उपयोग कैसे करें?


259

आम तौर पर, उपयोगकर्ता रूट का उपयोग करके डॉकटर कंटेनर चलाए जाते हैं । मैं एक अलग उपयोगकर्ता का उपयोग करना चाहूंगा, जिसे डॉकर के USER निर्देश का उपयोग करने में कोई समस्या नहीं है। लेकिन यह उपयोगकर्ता कंटेनर के अंदर sudo का उपयोग करने में सक्षम होना चाहिए । यह कमांड गायब है।

यहाँ इस उद्देश्य के लिए एक सरल डॉकफाइल दिया गया है:

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

इस कंटेनर को चलाने पर, मुझे उपयोगकर्ता 'docker' से लॉग इन करना पड़ता है। जब मैं sudo का उपयोग करने की कोशिश करता हूं, तो कमांड नहीं मिलती है। तो मैं का उपयोग कर अपने Dockerfile अंदर sudo पैकेज स्थापित करने की कोशिश की

RUN apt-get install sudo

यह पैकेज sudo का पता लगाने में असमर्थ है


बस उपयोगकर्ता को sudo group दें। askubuntu.com/questions/7477/…
रीगन

जवाबों:


242

अभी मिला है। जैसा कि रेगन ने कहा, मुझे उपयोगकर्ता को sudoers समूह में जोड़ना था। लेकिन मुख्य कारण मैं रिपॉजिटरी कैश को अपडेट करना भूल गया था, इसलिए सुडो पैकेज नहीं मिला। अब यह काम कर रहा है। यहाँ पूरा कोड है:

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
सेंटो में काम नहीं करता है। adduserआदेश के लिए उपयोग मदद बाहर थूकuseradd
Emad

CentOS के लिए, आप एक उपयोगकर्ता और समूह जोड़ सकते हैं, फिर एक शार्क फ़ाइल बनाएँ /etc/sudoers.d/और 440उस फ़ाइल पर अनुमतियाँ सेट करें । तब उपयोगकर्ता के पास CentOS, 6 और ऊपर के तहत sudo पहुंच होगी। 5 आपको #includedir /etc/sudoers.dनिर्देश को जोड़ना होगा/etc/sudoers
FilBot3

मेरे लिए काम नहीं करता है। मेरे पास वे त्रुटियां हैं: E: लॉक फ़ाइल / var / lib / apt / सूचियाँ / लॉक - ओपन नहीं कर सका (13: अनुमति अस्वीकृत) E: निर्देशिका / var / lib / apt / सूचियों को लॉक करने में असमर्थ /
Marosinho

1
यह उबंटू उबंटू 18.04
डॉकटर

100

जब कंटेनर में न तो sudo और apt-get उपलब्ध है, तो आप कमांड का उपयोग करके रूट यूजर के रूप में रनिंग कंटेनर में भी जा सकते हैं

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

यह एक बेहतर समाधान है जो ओपी शायद हासिल करना चाहता है, भले ही स्वीकृत जवाब अनुरोधित समाधान देता है। बहुत कम से कम, यह जवाब है जिसकी मुझे तलाश थी!
स्पिकजेट

79

अन्य उत्तर मेरे काम नहीं आए। मैं खोज करता रहा और एक ब्लॉग पोस्ट पाया जिसमें कवर किया गया था कि कैसे एक टीम डॉकटर कंटेनर के अंदर गैर-रूट चल रही थी।

यहाँ TL; DR संस्करण है:

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/
edesz

1
@ मुझे लगता है कि आपको पढ़ने के लिए उस लाइन को बदलना होगा RUN sudo apt-get install -y tree। के USERअलावा कुछ और के लिए सेट करने के बाद root, आपको sudoकिसी भी कमांड के लिए उपयोग करने की आवश्यकता होगी जिसे rootविशेषाधिकार की आवश्यकता होती है ।
एम। स्कॉट फोर्ड

आह, धन्यवाद! याद किया कि मुझे नहीं लगता sudoथा कि एक डॉकफ्राइल में अनुमति दी गई थी।
edesz

बिल्कुल सही, बस मुझे जो चाहिए था।
अरिन एकेंडेम

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

फिर प्रयास करें

RUN एप-गेट अपडेट या apt-get 'कुछ भी आप चाहते हैं'

यह मेरे साथ काम किया आशा है कि यह सभी के लिए उपयोगी है


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
आपके द्वारा उपयोग किए जा रहे डॉकटर चित्रों के आधार पर (मेरे मामले में Ubuntu: 18.04), आपको इसमें -eसे निकालने की आवश्यकता हो सकती है echo। अन्यथा यह फ़ाइल में मौजूद होगा, इसे अनंतिम प्रतिपादन करेगा।
चित्रकार

नीट विचार, लेकिन यह काम नहीं करेगा यदि मूल कमांड sudo विकल्पों का उपयोग कर रहा है, जैसे sudo -E ls। यह निष्पादित करने का प्रयास करेगा -E ls
17b

2

यह सभी छवियों के लिए काम नहीं कर सकता है, लेकिन कुछ छवियों में पहले से ही एक रूट उपयोगकर्ता होता है, जैसे कि jupyterhub / singleuser छवि। उस छवि के साथ यह बस है:

USER root
RUN sudo apt-get update

1

उपनाम का उपयोग करें।

alias sudo=''

सरल और कुशल। इसे खोलना मत भूलना .bashrc इसलिए यह एक शेल को फिर से खोलने के बाद भी काम करता है।

nano ~/.bashrc
alias sudo=''

चूंकि उपयोगकर्ता डोकर में डिफ़ॉल्ट रूट है, इसलिए sudo कमांड 'इग्नोर' सबसे आसान तरीका है।


0

स्वीकृत उत्तर के विपरीत , मैं usermodइसके बजाय का उपयोग करता हूं ।

डॉकटर में पहले से लॉग-इन रूट के रूप में मान लें, और "फ्रूट" वह नया नॉन-रूट यूज़रनेम है जिसे मैं जोड़ना चाहता हूं, बस इस लिंक को टाइप करें:

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

अपडेट के बाद इमेज सेव करना याद रखें। docker psवर्तमान रनिंग डॉकर की <कंटेनर आईडी> और <इमेज> प्राप्त करने के लिए उपयोग करें , फिर 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.