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


285

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

আমি যোগ চেষ্টা RUN adduser uwsgiএবং RUN adduser celeryআমার Dockerfile, কিন্তু এই, সমস্যা সৃষ্টি হয় এই ইনপুট জন্য প্রম্পট কমান্ড থেকে (আমি নিচে বিল্ড থেকে প্রতিক্রিয়া পোস্ট করেছেন)।

ব্যবহারকারীরা ডকার পাত্রে যুক্ত করার সর্বোত্তম উপায় কী যাতে কনটেইনারটিতে চালিত শ্রমিকদের অনুমতি নির্ধারণ করতে পারে?

আমার ডকার চিত্রটি সরকারী উবুন্টু 14.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
মনে রাখবেন যে আপনি যদি একটি বৃহত ব্যবহারকারীর আইডি সহ একটি নতুন ব্যবহারকারী তৈরি করছেন তবে ডকর ল্যাংলগ তৈরির চেষ্টা করার সাথে সাথে হ্যাং / ক্র্যাশ করতে পারে - একটি বিশাল স্পার ফাইল। --no-log-initবিকল্পটি দিয়ে এড়িয়ে চলুন useradd
ডেভিডা

10
সুন্দর টিপ, @ আইরিডিনিজ! আগে এটি কল করতে ভুলবেন না USER newuser। আপনার যদি রুট সুবিধাগুলি ব্যবহারকারীর প্রয়োজন হয় তবে আপনি এটি অন্তর্ভুক্ত করতে পারেন adduser <username> sudo
ইয়ামেনেকো

6
/bin/sh: useradd: not foundআলপাইন লিনাক্স
deathangel908

91

সংযোজক দ্বারা ইন্টারেক্টিভ প্রশ্নগুলি এড়াতে, আপনি এই পরামিতিগুলির সাথে এটি কল করতে পারেন:

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

--gecosপরামিতি অতিরিক্ত তথ্যটি সেট করতে ব্যবহৃত হয়। এই ক্ষেত্রে এটি খালি।

ব্যস্তবক্সযুক্ত সিস্টেমে (যেমন আলপাইন) ব্যবহার করুন

RUN adduser -D -g '' newuser

ব্যস্তবক্স অ্যাডুসার দেখুন


3
ধন্যবাদ! দেখে মনে হচ্ছে adduserউচ্চ-স্তরের সমাধানটি সাধারণত নিম্ন-স্তরের ফাংশনগুলি ব্যবহার করতে পছন্দ করা হয় useradd
আখমেড

adduser: unrecognized option: gecosএটি আলপাইন নিয়ে কাজ করবে বলে মনে হচ্ছে না।
weberc2

- - অক্ষম-পাসওয়ার্ডটি কী করে এবং আমরা কীভাবে ডকফাইলে একই সাথে ব্যবহারকারীর কাছে পাসওয়ার্ড সেট করতে পারি?
হোসেইন

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:):

  • -r, --systemএকটি সিস্টেম অ্যাকাউন্ট তৈরি করুন। দেখুন: জালিয়াতিগুলি সিস্টেম অ্যাকাউন্ট তৈরি করে
  • -m, --create-homeব্যবহারকারীর হোম ডিরেক্টরি তৈরি করুন।
  • -d, --home-dir HOME_DIRনতুন অ্যাকাউন্টের হোম ডিরেক্টরি।
  • -s, --shell SHELLলগইন নতুন অ্যাকাউন্ট শেল।
  • -g, --gid GROUPপ্রাথমিক গোষ্ঠীর নাম বা আইডি।
  • -G, --groups GROUPSপরিপূরক গ্রুপগুলির তালিকা।
  • -u, --uid UIDব্যবহারকারীর আইডি উল্লেখ করুন। দেখুন: ডকারের পাত্রে কীভাবে uid এবং gid কাজ করে তা বোঝা
  • -p, --password PASSWORDনতুন অ্যাকাউন্টের এনক্রিপ্ট করা পাসওয়ার্ড (যেমন ubuntu)।

ডিফল্ট ব্যবহারকারীর পাসওয়ার্ড সেট করা হচ্ছে

ব্যবহারকারীর পাসওয়ার্ড সেট -p "$(openssl passwd -1 ubuntu)"করতে useraddকমান্ডে যুক্ত করুন।

বিকল্পভাবে আপনার নিম্নলিখিত লাইনগুলি যুক্ত করুন Dockerfile:

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

প্রথম শেল নির্দেশ হ'ল কোনও পাইপের -o pipefailসাহায্যে বিকল্পটি সক্ষম করা আছে তা নিশ্চিত RUNকরা। আরও পড়ুন: হ্যাডলিন্ট: আপনার ডকফাইফিলকে আবদ্ধ করা


2
ব্যবহারকারী কেন মূল গোষ্ঠীতে থাকবে? এর পুরো বিষয়টি হ'ল সুরক্ষার প্রয়োজনে একটি অ-রুট ব্যবহারকারী থাকার কথা
নভেটেরাটা

5
@ নোভেটরটা ব্যবহারের উপর নির্ভর করে। rootগোষ্ঠীটি তাদের মূল অ্যাক্সেস আছে তা নির্দেশ করে না, এটি কেবলমাত্র কিছু ফাইল (যেমন লগ) এর আরও বেশি পড়ার অ্যাক্সেস পেয়েছে, যা দরকারী তবে এটি প্রকল্পের উপর নির্ভর করে।
কেনোর্ব

আমি দেখতে পাচ্ছি যে এটি কাজ করে, আমি স্বয়ংক্রিয়ভাবে ব্যবহারকারী হিসাবে লগ ইন করছি, তবে আমি এখনও রুটের মালিকানাধীন ফাইলগুলি তৈরি করছি। স্থানীয় ব্যবহারকারী এবং গোষ্ঠীতে আমার ব্যবহারকারীর নাম 'ব্যবহারকারী' হওয়ায় আমি এমনকি 'ব্যবহারকারী ব্যবহারকারী' ব্যবহার করেছি। এখনও মূল মালিকানাধীন ফাইল উত্পন্ন করে। আমার আরও কিছু করা উচিত? আমি মূলত একটি ডকার পাত্রে তৈরি করছি যা আমাদের কোডবেসকে সংকলন করে। সুতরাং এটি এসএনএন থেকে কোড পরীক্ষা করে, ব্যাশ উত্স ব্যবহার করে ভেরিয়েবল সেট আপ করে। আমি কখনই রুট পাসওয়ার্ডের জন্য জিজ্ঞাসা করি না তাও কি বাশ কমান্ডগুলি রুট হিসাবে কাজ করতে পারে?
জোমানিয়াছি

14

ব্যবহারকারীকে ডকারে যুক্ত করা এবং সেই ব্যবহারকারীর অধীনে আপনার অ্যাপ্লিকেশন চালানো সুরক্ষা দৃষ্টিকোণের জন্য খুব ভাল অনুশীলন। এটি করার জন্য আমি নীচের পদক্ষেপগুলির সুপারিশ করব:

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"]

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


1
অ্যাডগ্রুপটি আমার জন্য ব্যর্থ হয়েছে, পদক্ষেপ 11/15: রুন অ্যাডগ্রুপ-এস ব্যবহারকারীর নাম ---> db9fd22d469d বিকল্পের মধ্যে চালানো অস্পষ্ট (শেল, সিস্টেম) অ্যাডুজার [--home DIR] [- শেল শেল] [- কোন-তৈরি -হোম] [- আইডি আইডি] [--ফার্সুইড আইডি] [--stuid আইডি] [--gecos GECOS] [--ইংগ্রুপ গ্রুপ | --gid ID] [
--dis اهل

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

রেফারেন্স: ম্যান ইউজারড

RUNলাইন ব্যবহারকারী এবং গ্রুপ যোগ হবে app:

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

appচিত্রটি যদি বেস ইমেজ হিসাবে পুনরায় ব্যবহার করা হয় তার চেয়ে আরও নির্দিষ্ট নাম ব্যবহার করুন। অন্যদিকে, --shell /bin/bashআপনার যদি সত্যিই প্রয়োজন হয় তবে তা অন্তর্ভুক্ত করুন ।


আংশিক creditণ: উত্তর রায়ান এম


1

বিকল্পভাবে আপনি এটি করতে পারেন।

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

প্রথম কমান্ড ডেমো নামে একটি গ্রুপ তৈরি করে । দ্বিতীয় কমান্ড তৈরি করে ডেমো ব্যবহারকারী এবং তাকে আগে তৈরি ডেমো গ্রুপে যুক্ত করে।

পতাকাগুলির অর্থ:

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

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