डॉकटर कंटेनर में उपयोगकर्ताओं को कैसे जोड़ें?


285

मेरे पास कुछ प्रक्रियाओं (uwsgi और अजवाइन) के साथ एक डॉकटर कंटेनर है जो अंदर चल रहा है। मैं इन प्रक्रियाओं के लिए एक अजवाइन उपयोगकर्ता और एक uwsgi उपयोगकर्ता बनाना चाहता हूं और साथ ही एक श्रमिक समूह है जो वे दोनों, अनुमति देने के लिए संबंधित होंगे।

मैंने अपने डॉकरफाइल को जोड़ने RUN adduser uwsgiऔर जोड़ने की कोशिश की RUN adduser celery, लेकिन यह समस्या पैदा कर रहा है, क्योंकि ये कमांड इनपुट के लिए संकेत देते हैं (मैंने नीचे दिए गए बिल्ड से प्रतिक्रियाएं पोस्ट की हैं)।

डॉकटर कंटेनर में उपयोगकर्ताओं को जोड़ने का सबसे अच्छा तरीका क्या है ताकि कंटेनर में चलने वाले श्रमिकों के लिए अनुमतियाँ निर्धारित की जा सकें?

मेरी डॉकर छवि को Ubuntu14.04 आधार से बनाया गया है।

जब एड्यूसर कमांड चलाए जाते हैं तो यहां डॉकरफाइल से आउटपुट मिलता है:

Adding user `uwsgi' ...
Adding new group `uwsgi' (1000) ... 
Adding new user `uwsgi' (1000) with group `uwsgi' ... 
Creating home directory `/home/uwsgi' ...
Copying files from `/etc/skel' ... 
[91mEnter new UNIX password: Retype new UNIX password: [0m 
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m 
Try again? [y/N] 
Changing the user information for uwsgi
Enter the new value, or press ENTER for the default
    Full Name []: 
Room Number []:     Work Phone []:  Home Phone []:  Other []: 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m 
Is the information correct? [Y/n] 
---> 258f2f2f13df 
Removing intermediate container 59948863162a 
Step 5 : RUN adduser celery 
---> Running in be06f1e20f64 
Adding user `celery' ...
Adding new group `celery' (1001) ... 
Adding new user `celery' (1001) with group `celery' ... 
Creating home directory `/home/celery' ...
Copying files from `/etc/skel' ... 
[91mEnter new UNIX password: Retype new UNIX password: [0m 
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m 
Try again? [y/N] 
Changing the user information for celery
Enter the new value, or press ENTER for the default
    Full Name []:   Room Number []:     Work Phone []: 
Home Phone []:  Other []: 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m 
Is the information correct? [Y/n] 

जवाबों:


489

ट्रिक useraddइसके इंटरेक्टिव रैपर की जगह इस्तेमाल करना है adduser। मैं आमतौर पर उपयोगकर्ताओं को बनाता हूं:

RUN useradd -ms /bin/bash newuser

जो उपयोगकर्ता के लिए एक होम डायरेक्टरी बनाता है और यह सुनिश्चित करता है कि बैश डिफ़ॉल्ट शेल है।

फिर आप जोड़ सकते हैं:

USER newuser
WORKDIR /home/newuser

अपने कामचोर के लिए। प्रत्येक आदेश बाद में और साथ ही इंटरैक्टिव सत्र उपयोगकर्ता के रूप में निष्पादित किए जाएंगे newuser:

docker run -t -i image
newuser@131b7ad86360:~$

newuserउपयोगकर्ता कमांड को लागू करने से पहले आपको उन कार्यक्रमों को निष्पादित करने की अनुमति देनी होगी जिन्हें आप चलाने का इरादा रखते हैं।

कंटेनरों के अंदर गैर-विशेषाधिकार प्राप्त उपयोगकर्ताओं का उपयोग करना सुरक्षा कारणों से एक अच्छा विचार है। इसमें कुछ कमियां भी हैं। सबसे महत्वपूर्ण बात, आपकी छवि से छवियों को निकालने वाले लोगों को सुपरयूज़र विशेषाधिकारों के साथ कमांड निष्पादित करने से पहले रूट पर वापस स्विच करना होगा।


142
मैं एक डॉकफ़िल में पूर्ण नाम विकल्पों का उपयोग करने की सलाह दूंगा, जैसे एक स्क्रिप्ट में, छोटे लोगों के बजाय (अधिक उपयोग किए जाने पर जब अंतःक्रियात्मक आईएमओ का उपयोग किया जाता है)। useradd --create-home --shell /bin/bashसहकर्मियों के लिए अधिक समझने योग्य / पठनीय है।
बैपटिस्ट माथुस

25
पासवर्ड सेट करने के लिए आप chpasswd का उपयोग कर सकते हैं जैसे:RUN echo 'newuser:newpassword' | chpasswd
iuridiniz

3
ध्यान दें कि यदि आप एक बड़ी उपयोगकर्ता आईडी के साथ एक नया उपयोगकर्ता बना रहे हैं, तो docker हैंग / क्रैश हो सकता है क्योंकि यह लास्ट बनाने की कोशिश करता है - एक विशाल विरल फ़ाइल। इसके --no-log-initविकल्प से बचें useradd
davidA

10
अच्छी टिप, @iuridiniz! इससे पहले फोन करना न भूलें USER newuser। यदि आपको रूट विशेषाधिकार प्राप्त करने के लिए उपयोगकर्ता की आवश्यकता है, तो आप भी शामिल कर सकते हैं adduser <username> sudo
यमनको

6
/bin/sh: useradd: not foundअल्पाइन
लिनेक्स

91

Adduser द्वारा इंटरएक्टिव प्रश्नों से बचने के लिए, आप इसे इन मापदंडों के साथ कॉल कर सकते हैं:

RUN adduser --disabled-password --gecos '' newuser

--gecosपैरामीटर में अतिरिक्त जानकारी के सेट करने के लिए प्रयोग किया जाता है। इस मामले में यह सिर्फ खाली है।

बिजीबॉक्स (जैसे अल्पाइन) के साथ सिस्टम पर, का उपयोग करें

RUN adduser -D -g '' newuser

व्‍यस्‍त बॉक्‍स एडूसर देखें


3
धन्यवाद! ऐसा लगता है कि adduserउच्च-स्तरीय समाधान आमतौर पर निम्न-स्तरीय कार्यों का उपयोग करने के लिए पसंद किया जाता है useradd
Akhmed

adduser: unrecognized option: gecosयह अल्पाइन पर काम नहीं करता है।
वेबर 2

--disabled- पासवर्ड क्या करता है और हम Dockerfile में एक ही समय में उपयोगकर्ता को पासवर्ड कैसे सेट कर सकते हैं?
होसैन

72

उबंटू

निम्नलिखित पंक्तियों को निम्न में आज़माएँ Dockerfile:

RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1001 ubuntu
USER ubuntu
WORKDIR /home/ubuntu

useraddविकल्प (देखें:) man useradd:

डिफ़ॉल्ट उपयोगकर्ता का पासवर्ड सेट करना

उपयोगकर्ता पासवर्ड सेट करने के लिए जोड़ने -p "$(openssl passwd -1 ubuntu)"के लिए useraddआदेश।

वैकल्पिक रूप से निम्नलिखित पंक्तियों को अपने साथ जोड़ें Dockerfile:

SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN echo 'ubuntu:ubuntu' | chpasswd

पहला शेल निर्देश यह सुनिश्चित करने के लिए है कि इसमें एक पाइप के साथ -o pipefailविकल्प पहले सक्षम RUNहै। और अधिक पढ़ें: Hadolint: अपने Dockerfile Linting


2
उपयोगकर्ता मूल समूह में क्यों होगा? इस का पूरा बिंदु सुरक्षा उद्देश्यों के लिए एक गैर-रूट उपयोगकर्ता के लिए नहीं है
Novaterata

5
@ नोवाटरेटा उपयोग पर निर्भर करता है। rootसमूह इंगित नहीं करता है कि उनके पास रूट एक्सेस है, यह सिर्फ उन्होंने कुछ फ़ाइलों (जैसे लॉग्स) तक अधिक पढ़ा है, जो उपयोगी है, लेकिन यह परियोजना पर निर्भर करता है।
केनोरब

मैं देख सकता हूं कि यह काम करता है, मैं स्वचालित रूप से उपयोगकर्ता के रूप में लॉग इन हूं, लेकिन मैं अभी भी रूट के स्वामित्व वाली फाइलें पैदा कर रहा हूं। मैंने भी केवल 'USER उपयोगकर्ता' का उपयोग किया है क्योंकि स्थानीय उपयोगकर्ता और समूह पर मेरा उपयोगकर्ता नाम 'उपयोगकर्ता' है। अभी भी रूट के स्वामित्व वाली फ़ाइलें उत्पन्न करता है। क्या कुछ और है जो मुझे करना चाहिए? मैं मूल रूप से एक डॉकटर कंटेनर बना रहा हूं जो हमारे कोडबेस को संकलित करता है। तो यह svn से कोड की जाँच करता है, bash स्रोत का उपयोग करके चर सेट करता है। क्या bash कमांड रूट के रूप में चीजें कर सकता है, भले ही मुझे रूट पासवर्ड कभी नहीं पूछा गया हो?
जोमानियासी

14

Docker में उपयोगकर्ता को जोड़ना और उस उपयोगकर्ता के अंतर्गत अपना ऐप चलाना सुरक्षा के दृष्टिकोण से बहुत अच्छा अभ्यास है। ऐसा करने के लिए मैं नीचे दिए गए चरणों की सिफारिश करूंगा:

FROM node:10-alpine

# Copy source to container
RUN mkdir -p /usr/app/src

# Copy source code
COPY src /usr/app/src
COPY package.json /usr/app
COPY package-lock.json /usr/app

WORKDIR /usr/app

# Running npm install for production purpose will not run dev dependencies.
RUN npm install -only=production    

# Create a user group 'xyzgroup'
RUN addgroup -S xyzgroup

# Create a user 'appuser' under 'xyzgroup'
RUN adduser -S -D -h /usr/app/src appuser xyzgroup

# Chown all the files to the app user.
RUN chown -R appuser:xyzgroup /usr/app

# Switch to 'appuser'
USER appuser

# Open the mapped port
EXPOSE 3000

# Start the process
CMD ["npm", "start"]

उपर्युक्त चरण NodeJS प्रोजेक्ट फ़ाइलों की प्रतिलिपि बनाने का एक पूर्ण उदाहरण है, एक उपयोगकर्ता समूह और उपयोगकर्ता बनाना, प्रोजेक्ट फ़ोल्डर के लिए उपयोगकर्ता को अनुमति प्रदान करना, नए बनाए गए उपयोगकर्ता पर स्विच करना और उस उपयोगकर्ता के अंतर्गत ऐप चलाना।


1
Addgroup मेरे लिए विफल रहा, चरण 11/15: RUN addgroup -S उपयोगकर्ता नाम ---> db9fd22d469d विकल्प s में चल रहा है अस्पष्ट (शेल, सिस्टम) एड्यूसर [--home डीआईआर] [-shell SHELL] [--no-create -होम] [--आईडी आईडी] [--firstuid ID] [--lastuid आईडी] [--gecos GECOS] [--ingroup Group | --gid ID] [--disabled-password] [--disabled-login] [--encrypt-home] USER एक सामान्य उपयोगकर्ता जोड़ें
१५:३५ पर

9

आप खुले स्रोत डॉकरीफाइल का अनुकरण कर सकते हैं, उदाहरण के लिए:

नोड: नोड 12-जीथब

RUN groupadd --gid 1000 node \
    && useradd --uid 1000 --gid node --shell /bin/bash --create-home node

superset: superset-github

RUN useradd --user-group --create-home --no-log-init --shell /bin/bash 
    superset

मुझे लगता है कि खुले स्रोत का पालन करना एक अच्छा तरीका है।


3

हर किसी का अपना पसंदीदा है, और यह मेरा है:

RUN useradd --user-group --system --create-home --no-log-init app
USER app

संदर्भ: आदमी useradd

RUNलाइन उपयोगकर्ता और समूह जोड़ना होगा app:

root@ef3e54b60048:/# id app
uid=999(app) gid=999(app) groups=999(app)

appयदि आधार छवि के रूप में छवि का पुन: उपयोग किया जाना है तो उससे अधिक विशिष्ट नाम का उपयोग करें । एक तरफ के रूप में, --shell /bin/bashयदि आपको वास्तव में ज़रूरत है तो शामिल करें ।


आंशिक क्रेडिट: रेयान एम द्वारा उत्तर


1

वैकल्पिक रूप से आप ऐसा कर सकते हैं।

RUN addgroup demo && adduser -DH -G demo demo

पहला कमांड डेमो नामक समूह बनाता है । दूसरा कमांड डेमो उपयोगकर्ता बनाता है और पहले से बनाए गए डेमो में उसे जोड़ता है ग्रुप में ।

झंडे के लिए खड़ा है:

-G Group
-D Don't assign password
-H Don't create home directory

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.