डिफ़ॉल्ट रूप से जब आप चलाते हैं
docker run -it [myimage]
या
docker attach [mycontainer]
आप टर्मिनल को रूट उपयोगकर्ता के रूप में कनेक्ट करते हैं, लेकिन मैं एक अलग उपयोगकर्ता के रूप में कनेक्ट करना चाहूंगा। क्या यह संभव है?
डिफ़ॉल्ट रूप से जब आप चलाते हैं
docker run -it [myimage]
या
docker attach [mycontainer]
आप टर्मिनल को रूट उपयोगकर्ता के रूप में कनेक्ट करते हैं, लेकिन मैं एक अलग उपयोगकर्ता के रूप में कनेक्ट करना चाहूंगा। क्या यह संभव है?
su user_name
जवाबों:
के लिए 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)
यदि आप वास्तव में उस उपयोगकर्ता से जुड़ना चाहते हैं जो आपके पास है, तो
run --user <user>
या अपने Dockerfile
उपयोग में इसका उल्लेख करेंUSER
आप एक कमांड का उपयोग करके एक रनिंग डॉक कंटेनर में एक शेल चला सकते हैं:
docker exec -it --user root <container id> /bin/bash
--user
विकल्प को तब छोड़ा जा सकता है जब कमांड्स को रूट के रूप में चलाया जाए जो मुझे लगता है।
USER
, देखें docs.docker.com/engine/reference/builder/#user
आप USER
डॉकरफाइल में निर्दिष्ट कर सकते हैं । बाद के सभी कार्यों को उस खाते का उपयोग करके किया जाएगा। आप USER
एक पंक्ति निर्दिष्ट कर सकते हैं CMD
या उससे पहले ENTRYPOINT
यदि आप केवल उस उपयोगकर्ता का उपयोग करना चाहते हैं जब कंटेनर लॉन्च कर रहा हो (और छवि बनाते समय नहीं)। जब आप परिणामी छवि से एक कंटेनर शुरू करते हैं, तो आप निर्दिष्ट उपयोगकर्ता के रूप में संलग्न करेंगे।
एक ही रास्ता है जिससे मैं यह काम कर पा रहा हूँ:
docker run -it -e USER=$USER -v /etc/passwd:/etc/passwd -v `pwd`:/siem mono bash
su - magnus
तो मुझे दोनों USER पर्यावरण चर के साथ-साथ एक बिंदु / etc / passwd फ़ाइल को निर्दिष्ट करना होगा। इस तरह, मैं / siem फ़ोल्डर को संकलित कर सकता हूं और वहां रूट के रूप में फ़ाइलों का स्वामित्व बनाए रख सकता हूं।
मेरा समाधान:
#!/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
मशीनरी के निर्माण के द्वारा बनाई गई किसी भी फाइल / निर्देशिका के उपयोगकर्ता स्वामित्व की अनुमति देता है।
जबकि यह हमारे लिए काम करता है। यह हैकी की तरह लगता है। मैं वैकल्पिक कार्यान्वयन के लिए खुला हूँ ...
Www-data उपयोगकर्ता के रूप में निष्पादित कमांड: docker exec -t --user www-data container bash -c "ls -la"
2020 से एक अद्यतन उत्तर के रूप में --user, -u विकल्प उपयोगकर्ता नाम या यूआईडी (प्रारूप: <नाम | uid> [: <समूह | gid>]) है।
फिर, यह मेरे लिए इस तरह काम करता है,
docker exec -it -u root:root container /bin/bash
संदर्भ: https://docs.docker.com/engine/reference/commandline/exec/
इससे मेरा उपयोग मामला हल हो गया है: "WSL2 के साथ डॉक डेस्कटॉप पर चलने वाले विंडोज पर नोडज कंटेनर में वेबपैक सामान संकलित करें और आपके वर्तमान में लॉग इन उपयोगकर्ता के तहत निर्मित संपत्ति हैं।"
docker run -u 1000 -v "$PWD":/build -w /build node:10.23 /bin/sh -c 'npm install && npm run build'
Eigenfield द्वारा उत्तर के आधार पर । धन्यवाद!
इसके अलावा इस सामग्री मुझे समझने क्या चल रहा है मदद की।
docker run --user user_name