रूट के अलावा उपयोगकर्ता के रूप में डॉकटर कंटेनर से कनेक्ट करें


85

डिफ़ॉल्ट रूप से जब आप चलाते हैं

docker run -it [myimage]

या

docker attach [mycontainer]

आप टर्मिनल को रूट उपयोगकर्ता के रूप में कनेक्ट करते हैं, लेकिन मैं एक अलग उपयोगकर्ता के रूप में कनेक्ट करना चाहूंगा। क्या यह संभव है?


3
हाँ। docker run --user user_name
जिऑनबिंग जिन

1
अटैच के लिए ऐसा कोई विकल्प नहीं है। आपको रूट के रूप में लॉगिन करना होगा और फिरsu user_name
Xiongbing Jin

जवाबों:


94

के लिए docker run:

--user <user>जब आप डॉक कंटेनर शुरू करते हैं, तो दूसरे उपयोगकर्ता में बदलने का विकल्प जोड़ें ।

docker run -it --user nobody busybox

के लिए docker attachया docker exec:

चूंकि मौजूदा प्रक्रिया में संलग्न / निष्पादित करने के लिए कमांड का उपयोग किया जाता है, इसलिए यह सीधे वर्तमान उपयोगकर्ता का उपयोग करता है।

docker run -it busybox  # CTRL-P/Q to quit
docker attach <container id>  # then you have root user
/ # id
uid=0(root) gid=0(root) groups=10(wheel)

docker run -it --user nobody busybox # CTRL-P/Q to quit
docker attach <container id>  
/ $ id
uid=99(nobody) gid=99(nogroup)

यदि आप वास्तव में उस उपयोगकर्ता से जुड़ना चाहते हैं जो आपके पास है, तो

  1. उस उपयोगकर्ता के साथ शुरू करें run --user <user>या अपने Dockerfileउपयोग में इसका उल्लेख करेंUSER
  2. `सु का उपयोग कर उपयोगकर्ता बदलें

72

आप एक कमांड का उपयोग करके एक रनिंग डॉक कंटेनर में एक शेल चला सकते हैं:

docker exec -it --user root <container id> /bin/bash


2
रूट डिफ़ॉल्ट उपयोगकर्ता है। --userविकल्प को तब छोड़ा जा सकता है जब कमांड्स को रूट के रूप में चलाया जाए जो मुझे लगता है।
स्टीफन

8
@ स्टेफ़ेन हमेशा ऐसा नहीं होता है क्योंकि डिफ़ॉल्ट उपयोगकर्ता को निर्देश के माध्यम से डॉकरफाइल में अनुकूलित किया जा सकता है USER, देखें docs.docker.com/engine/reference/builder/#user
ryenus

5

आप USERडॉकरफाइल में निर्दिष्ट कर सकते हैं । बाद के सभी कार्यों को उस खाते का उपयोग करके किया जाएगा। आप USERएक पंक्ति निर्दिष्ट कर सकते हैं CMDया उससे पहले ENTRYPOINTयदि आप केवल उस उपयोगकर्ता का उपयोग करना चाहते हैं जब कंटेनर लॉन्च कर रहा हो (और छवि बनाते समय नहीं)। जब आप परिणामी छवि से एक कंटेनर शुरू करते हैं, तो आप निर्दिष्ट उपयोगकर्ता के रूप में संलग्न करेंगे।


इसके अलावा भूलकर भी घर पर सेट न करें
karthik101

2

एक ही रास्ता है जिससे मैं यह काम कर पा रहा हूँ:

docker run -it -e USER=$USER -v /etc/passwd:/etc/passwd -v `pwd`:/siem mono bash
su - magnus

तो मुझे दोनों USER पर्यावरण चर के साथ-साथ एक बिंदु / etc / passwd फ़ाइल को निर्दिष्ट करना होगा। इस तरह, मैं / siem फ़ोल्डर को संकलित कर सकता हूं और वहां रूट के रूप में फ़ाइलों का स्वामित्व बनाए रख सकता हूं।


'जैसा है' काम नहीं किया, लेकिन मुझे काम करने के लिए निर्देशित किया। धन्यवाद!
जोसेफ साब्ल

1

मेरा समाधान:

#!/bin/bash
user_cmds="$@"

GID=$(id -g $USER)
UID=$(id -u $USER)
RUN_SCRIPT=$(mktemp -p $(pwd))
(
cat << EOF
addgroup --gid $GID $USER
useradd --no-create-home --home /cmd --gid $GID --uid $UID  $USER
cd /cmd
runuser -l $USER -c "${user_cmds}"
EOF
) > $RUN_SCRIPT

trap "rm -rf $RUN_SCRIPT" EXIT

docker run -v $(pwd):/cmd --rm my-docker-image "bash /cmd/$(basename ${RUN_SCRIPT})"

यह उपयोगकर्ता द्वारा प्रदान किए गए टूल का उपयोग करके मनमानी कमांड चलाने की अनुमति देता है my-docker-image। ध्यान दें कि उपयोगकर्ता की वर्तमान कार्यशील मात्रा /cmdको कंटेनर के अंदर कैसे रखा जाता है।

मैं इस वर्कफ़्लो का उपयोग my-docker-imageआर्म 64 लक्ष्य के लिए मेरे देव-दल को क्रॉस-कंपाइल सी / सी ++ कोड को करने की अनुमति देने के लिए कर रहा हूं, जिसकी bsp मैं बनाए रखता हूं ( जिसमें क्रॉस-कंपाइलर, sysroot, मेक, cmake, आदि शामिल हैं)। इसके साथ एक उपयोगकर्ता कुछ ऐसा कर सकता है:

cd /path/to/target_software
cross_compile.sh "mkdir build; cd build; cmake ../; make"

कहाँ cross_compile.shऊपर दिखाए गए स्क्रिप्ट है। addgroup/useraddमशीनरी के निर्माण के द्वारा बनाई गई किसी भी फाइल / निर्देशिका के उपयोगकर्ता स्वामित्व की अनुमति देता है।

जबकि यह हमारे लिए काम करता है। यह हैकी की तरह लगता है। मैं वैकल्पिक कार्यान्वयन के लिए खुला हूँ ...



0

के लिए docker-compose। में docker-compose.yml:

version: '3'
services:
    app:
        image: ...
        user: ${UID:-0}
...

इन .env:

UID=1000

0

2020 से एक अद्यतन उत्तर के रूप में --user, -u विकल्प उपयोगकर्ता नाम या यूआईडी (प्रारूप: <नाम | uid> [: <समूह | gid>]) है।

फिर, यह मेरे लिए इस तरह काम करता है,

docker exec -it -u root:root container /bin/bash

संदर्भ: https://docs.docker.com/engine/reference/commandline/exec/


0

इससे मेरा उपयोग मामला हल हो गया है: "WSL2 के साथ डॉक डेस्कटॉप पर चलने वाले विंडोज पर नोडज कंटेनर में वेबपैक सामान संकलित करें और आपके वर्तमान में लॉग इन उपयोगकर्ता के तहत निर्मित संपत्ति हैं।"

docker run -u 1000 -v "$PWD":/build -w /build node:10.23 /bin/sh -c 'npm install && npm run build'

Eigenfield द्वारा उत्तर के आधार पर । धन्यवाद!

इसके अलावा इस सामग्री मुझे समझने क्या चल रहा है मदद की।

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