डॉकर छवि के अंदर उपयोगकर्ताओं को एक गैर-रूट उपयोगकर्ता में बदलना


80

मैं SSH प्रमाणपत्र सेट करने के लिए उपयोगकर्ता को tomcat7 उपयोगकर्ता पर स्विच करने का प्रयास कर रहा हूं।

जब मैं करता हूं su tomcat7 , तो कुछ भी नहीं होता है।

whoami अभी भी करने के बाद रूट ruturns su tomcat7

एक करने से more /etc/passwd, मुझे निम्नलिखित परिणाम मिलते हैं जो स्पष्ट रूप से दिखाता है कि एक tomcat7 उपयोगकर्ता मौजूद है:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
messagebus:x:101:104::/var/run/dbus:/bin/false
colord:x:102:105:colord colour management daemon,,,:/var/lib/colord:/bin/false
saned:x:103:106::/home/saned:/bin/false
tomcat7:x:104:107::/usr/share/tomcat7:/bin/false

मैं हडसन में इस त्रुटि के आसपास काम करने की कोशिश कर रहा हूं:

Command "git fetch -t git@________.co.za:_______/_____________.git +refs/heads/*:refs/remotes/origin/*" returned status code 128: Host key verification failed.

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

FROM debian:wheezy

# install java on image
RUN apt-get update
RUN apt-get install -y openjdk-7-jdk tomcat7

# install hudson on image
RUN rm -rf /var/lib/tomcat7/webapps/*
ADD ./ROOT.tar.gz /var/lib/tomcat7/webapps/

# copy hudson config over to image
RUN mkdir /usr/share/tomcat7/.hudson
ADD ./dothudson.tar.gz /usr/share/tomcat7/
RUN chown -R tomcat7:tomcat7 /usr/share/tomcat7/

# add ssh certificates
RUN mkdir /root/.ssh
ADD ssh.tar.gz /root/

# install some dependencies
RUN apt-get update
RUN apt-get install --y maven
RUN apt-get install --y git
RUN apt-get install --y subversion

# background script
ADD run.sh /root/run.sh
RUN chmod +x /root/run.sh

# expose port 8080
EXPOSE 8080


CMD ["/root/run.sh"]

मैं Docker के नवीनतम संस्करण (Docker संस्करण 1.0.0, 63fe64c / 1.0.0 का निर्माण कर रहा हूं) का उपयोग कर रहा हूं, क्या यह Docker में बग है या मैं अपने Dockerfile में कुछ याद कर रहा हूं?


4
क्या आप USERडॉकरफाइल निर्देश से अवगत हैं ?
icecrime

1
नहीं, आप क्या सुझाव देते हैं कि मैं इसके लिए उपयोग करता हूं?
जाॅन व्लादिमीर मोस्टर्ट

क्या USER निर्देश का उपयोग करके Dockerfile के माध्यम से प्रमाण पत्र बनाना संभव होगा?
जाॅन व्लादिमीर मोस्टर्ट

3
RUNएक USERनिर्देश के बाद सब कुछ आप इसी यूआईडी के तहत किया जाता है, इसलिए यद्यपि मुझे यकीन नहीं है कि मैं आपकी समस्या को पूरी तरह से समझ रहा हूं, ऐसा लगता है कि यह वही हो सकता है जो आप खोज रहे हैं।
icecrime

@icecrime सब कुछ नहीं, दुर्भाग्य से। COPYफ़ाइलों को uid 0 के रूप में बनाता है, जिसका अर्थ है कि वे गैर-रूट उपयोगकर्ता द्वारा लिखने योग्य नहीं हैं, और RUN chown ...उन फ़ाइलों पर चलना तब तक काम नहीं करेगा जब तक कि वर्तमान उपयोगकर्ता भी रूट नहीं होता है। तो एक रूट और दूसरे उपयोगकर्ता के बीच डॉकरीफाइल में आगे और पीछे स्विच करता है।
दाविद

जवाबों:


119

आपको डॉकटराइलsu में उपयोग नहीं करना चाहिए , हालांकि आपको डॉकरफाइल में निर्देश का उपयोग करना चाहिए ।USER

Dockerfile बिल्ड के प्रत्येक चरण में , एक नया कंटेनर बनाया जाता है ताकि उपयोगकर्ता के लिए आपके द्वारा किए गए किसी भी परिवर्तन को अगले बिल्ड चरण पर जारी न रखा जा सके।

उदाहरण के लिए:

RUN whoami
RUN su test
RUN whoami

यह कभी नहीं कहेगा कि उपयोगकर्ता के testरूप में एक नया कंटेनर 2 whoami पर देखा जाता है। आउटपुट दोनों पर मूल होगा (जब तक कि आप पहले से USER नहीं चलाते)।

यदि आप करते हैं:

RUN whoami
USER test
RUN whoami

आपको rootतब देखना चाहिए test

वैकल्पिक रूप से आप सूडो के साथ एक अलग उपयोगकर्ता के रूप में कुछ के साथ एक कमांड चला सकते हैं

sudo -u test whoami

लेकिन आधिकारिक समर्थित निर्देश का उपयोग करना बेहतर लगता है।


मैं यह सुनिश्चित करने के बारे में उत्सुक हूं कि पहले से चलाए गए आदेश डॉकफाइल में उपयोगकर्ता के लिए कैसे उपलब्ध हैं। मेरे पास एक सवाल है जहां USERअनुदेश द्वारा किसी अन्य उपयोगकर्ता पर स्विच करने के बाद पहले रूट द्वारा निर्धारित फ़ोल्डर और अनुमतियाँ उपलब्ध नहीं हैं ।
स्पेंसर विलियम्स

3
आपको COPY --chown=myuser ...सड़क की आवश्यकता हो सकती है ।
x-yuri

39

दूसरे उत्तर के लिए एक अलग दृष्टिकोण के रूप में, डॉकरफाइल पर छवि निर्माण पर उपयोगकर्ता को इंगित करने के बजाय, आप कमांड-लाइन के माध्यम से एक विशेष कंटेनर पर प्रति-कमांड के आधार पर ऐसा कर सकते हैं।

इसके साथ docker exec, --userयह बताने के लिए कि कौन सा उपयोगकर्ता खाता इंटरएक्टिव टर्मिनल का उपयोग करेगा (कंटेनर चालू होना चाहिए और उपयोगकर्ता को कंटेनर में मौजूद होना चाहिए):

docker exec -it --user [username] [container] bash

Https://docs.docker.com/engine/reference/commandline/exec/ देखें



3

तुम भी करने में सक्षम होना चाहिए:

apt install sudo

sudo -i -u tomcat

तब आपको टॉमकैट उपयोगकर्ता होना चाहिए। यह स्पष्ट नहीं है कि आप किस लिनक्स वितरण का उपयोग कर रहे हैं, लेकिन यह उदाहरण के लिए Ubuntu 18.04 LTS के साथ काम करता है।


1

मामले में आपको विशेषाधिकार प्राप्त कार्यों को करने की आवश्यकता होती है जैसे कि फ़ोल्डर की अनुमतियाँ बदलना आप उन कार्यों को रूट उपयोगकर्ता के रूप में कर सकते हैं और फिर एक गैर-विशेषाधिकार प्राप्त उपयोगकर्ता बना सकते हैं और उस पर स्विच कर सकते हैं:

From <some-base-image:tag>

# Switch to root user
USER root # <--- Usually you won't be needed it - Depends on base image

# Run privileged command
RUN apt install <packages>
RUN apt <privileged command>

# Set user and group
ARG user=appuser
ARG group=appuser
ARG uid=1000
ARG gid=1000
RUN groupadd -g ${gid} ${group}
RUN useradd -u ${uid} -g ${group} -s /bin/sh -m ${user} # <--- the '-m' create a user home directory

# Switch to user
USER ${uid}:${gid}

# Run non-privileged command
RUN apt <non-privileged command>

-8

ऐसा करने का कोई वास्तविक तरीका नहीं है। नतीजतन, mysqld_safe जैसी चीजें विफल हो जाती हैं, और आप एक डेबियन डॉकटर कंटेनर में mysql- सर्वर को 40 हुप्स के माध्यम से कूदने के बिना स्थापित नहीं कर सकते क्योंकि .. अच्छी तरह से ... यह रूट नहीं होने पर गर्भपात करता है।

आप USER का उपयोग कर सकते हैं, लेकिन यदि आप रूट नहीं हैं तो आप एप्ट-गेट स्थापित नहीं कर पाएंगे।

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