Docker: Unix में Docker डेमन सॉकेट से कनेक्ट करने की कोशिश करते समय अनुमति नहीं मिली: ///var/run/docker.sock


175

मैं डोकर के लिए नया हूँ। मैंने सिर्फ जेनकिन्स के साथ अपने स्थानीय मशीन (Ubuntu 16.04) में डॉकटर का उपयोग करने की कोशिश की।

मैंने नीचे पाइपलाइन स्क्रिप्ट के साथ एक नई नौकरी कॉन्फ़िगर की है।

node {
    stage('Build') {
      docker.image('maven:3.3.3').inside {
        sh 'mvn --version'
      }
    }
}

लेकिन यह नीचे त्रुटि के साथ विफल रहता है।

यहां छवि विवरण दर्ज करें


1
यह एक अखंड जेनकींस है या एक मास्टर-दास सेटअप है? चेक करें कि आप किस उपयोगकर्ता के साथ कमांडर निरीक्षण कमांड निष्पादित कर रहे हैं। यह देखें कि क्या /var/run/docker.sock में RW समूह की पहुँच है।
राम कामथ


जवाबों:


295

उपयोगकर्ता jenkinsको समूह में जोड़ा जाना चाहिए docker:

sudo usermod -a -G docker jenkins

तब जेनकींस पुनरारंभ करें।

संपादित करें

यदि आप स्टैक ओवरफ़्लो के इस प्रश्न पर पहुँचते हैं क्योंकि आपको यह संदेश docker से प्राप्त होता है, लेकिन आप jenkins का उपयोग नहीं करते हैं, तो संभवत: त्रुटि समान है: आपका अनपेक्षित उपयोगकर्ता docker समूह से संबंधित नहीं है।

तुम कर सकते हो:

sudo usermod -a -G docker alice

या जो भी आपका उपयोगकर्ता नाम है।

आप इसे अंत में grep docker /etc/groupदेख सकते हैं और कुछ इस तरह से देख सकते हैं:

docker:x:998:alice

लाइनों में से एक में।

फिर अपने उपयोगकर्ता समूह आईडी को इसमें बदलें docker:

newgrp docker

88
और पुनः उपयोग करने वाला उपयोगकर्ता
इल्या

8
अच्छा जवाब, लेकिन अधिक सामान्य होने के लिए हम यह कर सकते हैं: sudo usermod -a -G docker $USERऔर लॉगआउट या रिबूट। लिंक
जुलिएन न्याम्बल

10
मुझे वास्तव में काम करने के लिए अपने सर्वर को पुनरारंभ करना पड़ा।
etagwerker

3
मुझे काम करने के लिए अपने नोड्स को डिस्कनेक्ट / पुनः कनेक्ट करना पड़ा (वे ssh से जुड़े हुए हैं)
GaspardP

28
फिर से लॉगिन करने की आवश्यकता नहीं है, बस newgrp dockerउसी टर्मिनल सत्र में उपयोग करें ।
11:14

68

मेरा पहला समाधान था:

usermod -aG docker jenkins
usermod -aG root jenkins
chmod 664 /var/run/docker.sock

लेकिन उनमें से कोई भी मेरे लिए काम नहीं करता, मैंने कोशिश की:

chmod 777 /var/run/docker.sock

काम करता है यही कारण है कि, लेकिन मैं अगर यह सही कॉल है पता नहीं है।


4
शायद यही कारण है कि यह विफल रहा क्योंकि आपको टर्मिनल को फिर से खोलना पड़ा। यह 664 करने के बाद में विफल रहा है, लेकिन फिर मैं एक नया खोल यह काम शुरू कर दी।
PHGamer

1
मैंने फिर से खोलने की कोशिश की, लेकिन यह आखिरी काम 777
विडंबना

समस्या यह थी कि रिबूट के बाद 777 को 660 पर रीसेट कर दिया गया था। मेरे लिए समस्या जो थी वह थी 'usermod -aG यूजर्स' jkins '।
व्यंग्यात्मक

मुझे लगता है कि यह रीसेट हो गया था, लेकिन 777 के लिए docker.sock अनुमतियों को सेट न करें। यह आपके सिस्टम पर किसी को भी रूट देता है। वे डॉकटर से बात करने और विशेषाधिकार प्राप्त कंटेनरों को बिना किसी प्रतिबंध के बनाने में सक्षम हैं।
लांस हडसन

3
इसके बावजूद लेखक के लिए और यहां तक ​​कि मेरे लिए काम करने के बावजूद, docker.sockफ़ाइल को अधिक एक्सेस देना सबसे अच्छा समाधान नहीं है, आपको केवल usermod... निर्देशों को निष्पादित करने की आवश्यकता है , और फिर अपने सिस्टम को रिबूट करें, अन्यथा यह प्रभावी नहीं होता है
Mariano Ruiz

32

मेरे लिए सफलता

sudo usermod -a -G docker $USER
reboot

5
रिबूट की आवश्यकता नहीं है। बस आउट करके पुन: प्रवेश करें। मैं usermod के बारे में बात कर रहा हूं
अब्देनौर TOUMI

1
उबंटू 18.04 पर, मैं काम करने के लिए सेटिंग के लिए रिबूट करना पड़ा।
निखिल

1
उबंटू 20.04 पर मैं रिबूट की जरूरत है। बंद सत्र के लिए पर्याप्त नहीं।

या लॉग आउट करने के बजाय su $ {USER}
चलाएं

19

2018/08/19

मैं इस पर एक दिन के लिए अटक गया है और के रूप में मैं क्यों और कैसे के साथ एक पूर्ण जवाब नहीं मिला है, मैं अन्य लोगों के लिए एक ही पोस्ट करेंगे जो एक ही समस्या पर ठोकर खाते हैं और ऊपर से जवाब काम नहीं करते हैं।

डॉकटर के अंदर जेनकींस चलाते समय ये 3 महत्वपूर्ण चरण हैं:

  1. आप /var/run/docker.sockहोस्ट से डॉकटर का उपयोग करने में सक्षम होने के लिए सॉकेट को जेनकिंस कंटेनर में माउंट करते हैं ।
  2. आपको इसे इस्तेमाल करने के लिए कंटेनर के अंदर डॉकटर इंस्टॉल करना होगा। यह कैसे करना है पर एक महान और सरल लेख है। नोट नए संस्करण पहले से ही डोकर स्थापित किया है हो सकता है कि
  3. आप sudo usermod -a -G docker jenkinsडॉकटर समूह में जेनकींस को जोड़ने के लिए चलाते हैं । हालाँकि, यहाँ आप एक समस्या में भाग सकते हैं यदि मेजबान docker और कंटेनर docker के पास एक ही समूह id नहीं है, तो कंटेनर docker के gid को समायोजित करने के लिए यह बहुत महत्वपूर्ण है कि मेजबान docker gid

आप इसे लॉन्च स्क्रिप्ट के एक भाग के रूप में या बस execमैन्युअल रूप से उपयोग करके और कर सकते हैं groupmod -g <YOUR_HOST_DOCKER_GID> docker:।

इसके अलावा, अनुमतियां न बदलें की /var/run/docker.sock777 या ऐसा सामान है क्योंकि यह एक बड़ी सुरक्षा जोखिम है, तो आप मूल रूप से दे रहे हैं है हर किसी को आपकी मशीन पर उपयोग डोकर करने की अनुमति

उम्मीद है की यह मदद करेगा


1
धन्यवाद - ध्यान दें कि वर्तमान जेनकींस डॉकटर छवियों के लिए डॉक कमांड पहले से ही स्थापित हैं (और उपयुक्त नहीं है।) आपके अन्य बिंदु - जेनकिंस को सही समूह में जोड़ना और जीआईडी ​​को डॉकिंग होस्ट से मेल खाना सुनिश्चित करना। सटीक।
स्टीव बॉन्ड्स

1
ग्रुप आईडी की समस्या से मेरा जीवन बचाया। धन्यवाद!
लेनकोवी

13

मैंने jenkins उपयोगकर्ता को रूट समूह में जोड़ा और jenkins को पुनरारंभ किया और यह काम करना शुरू कर दिया।

sudo usermod -a -G root jenkins
sudo service jenkins restart

16
यह एक खराब सुरक्षा प्रथा है। पसंदीदा दृष्टिकोण यह उत्तर है
केविन्दूब

11

Docker.sock फ़ाइल की पहुँच अनुमति बदलें

chmod 777 /var/run/docker.sock

या आप sudoकमांड की शुरुआत में उपयोग कर सकते हैं ।

chmod 777सभी उपयोगकर्ताओं के लिए सभी कार्यों chmod 666की अनुमति देगा जबकि सभी उपयोगकर्ताओं को पढ़ने और लिखने की अनुमति देगा, लेकिन फ़ाइल को निष्पादित नहीं कर सकता है।


यह वही है जो मुझे चाहिए, धन्यवाद!
crazynx

9

बस उपयोगकर्ता के लिए dockerएक पूरक समूह के रूप में जोड़नाjenkins

sudo usermod -a -G docker jenkins

जेनकींस एजेंट के रूप में डॉकर छवि का उपयोग करते समय हमेशा पर्याप्त नहीं होता है । यही है, अगर आपके Jenkinsfileसाथ शुरू होता है pipeline{agent{dockerfileया pipeline{agent{image:

pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile.jenkinsAgent'
        }
    }
    stages {

ऐसा इसलिए है क्योंकि जेनकिन्स एक docker runकमांड करता है , जिसके परिणामस्वरूप तीन समस्याएं होती हैं।

  • एजेंट के पास (शायद) डॉकर प्रोग्राम इंस्टॉल नहीं होंगे।
  • एजेंट के पास डॉकर डेमन सॉकेट तक पहुंच नहीं होगी, और इसलिए डॉकर-इन-डॉकर को चलाने की कोशिश की जाएगी, जो अनुशंसित नहीं है
  • जेनकिंस संख्यात्मक उपयोगकर्ता आईडी और संख्यात्मक समूह आईडी देता है जिसका उपयोग एजेंट को करना चाहिए। एजेंट के पास कोई पूरक समूह नहीं होगा, क्योंकि docker runकंटेनर में लॉगिन नहीं होता है (यह अधिक पसंद है sudo)।

एजेंट के लिए डॉकर इंस्टॉल करना

Docker छवि के भीतर Docker कार्यक्रमों को उपलब्ध कराने के लिए बस आपके Dockerfile में Docker स्थापना चरणों को चलाने की आवश्यकता होती है :

# Dockerfile.jenkinsAgent
FROM debian:stretch-backports
# Install Docker in the image, which adds a docker group
RUN apt-get -y update && \
 apt-get -y install \
   apt-transport-https \
   ca-certificates \
   curl \
   gnupg \
   lsb-release \
   software-properties-common

RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

RUN apt-get -y update && \
 apt-get -y install \
   docker-ce \
   docker-ce-cli \
   containerd.io

...

डॉकर डेमन सॉकेट को साझा करना

जैसा कि पहले कहा गया है , दूसरी समस्या को ठीक करने का मतलब जेनकिन्स डॉकटर कंटेनर को चलाना है ताकि यह डॉकर डेमन सॉकेट को डॉकटर डेमन के साथ साझा करे जो कंटेनर के बाहर है। तो आपको उस साझाकरण के साथ जेनकिन को डॉकटर कंटेनर चलाने के लिए कहना होगा, इस प्रकार:

pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile.jenkinsAgent'
            args '-v /var/run/docker.sock:/var/run/docker.sock'
        }
    }

यूआईडी और जीआईडी ​​सेट करना

तीसरी समस्या के लिए आदर्श निर्धारण एजेंट के लिए पूरक समूह स्थापित करेगा। यह संभव नहीं लगता। एकमात्र फिक्स जो मुझे पता है कि जेनकिन्स यूआईडी और डॉकर जीआईडी ​​के साथ एजेंट को चलाने के लिए है (सॉकेट में समूह लेखन अनुमति है और इसके स्वामित्व में है root.docker)। लेकिन सामान्य तौर पर, आप यह नहीं जानते कि वे आईडी क्या हैं (वे तब आवंटित किए गए थे, जब जेनकींस और डॉकर मेजबान पर स्थापित किए गए थे useradd ... jenkinsऔर groupadd ... dockerभाग गए थे)। और आप बस उपयोगकर्ता उपयोगकर्ता jenkinsऔर समूह को जेनकिंस नहीं बता सकतेdocker

args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'

क्योंकि वह डॉकटर को उस उपयोगकर्ता और समूह का उपयोग करने के लिए कहता है जो नाम jenkinsऔर docker छवि के भीतर हैं , और आपकी डॉकटर छवि में jenkinsउपयोगकर्ता और समूह नहीं है, और अगर ऐसा नहीं होता तो भी इसकी गारंटी नहीं होगी, जैसा कि यूआईडी और जीआईडी ​​होगा मेजबान, और इसी तरह की कोई गारंटी नहीं है कि dockerGID समान है

सौभाग्य से, जेनकिंस docker buildएक स्क्रिप्ट में आपके डॉकरफाइल के लिए कमांड चलाता है , इसलिए आप उस जानकारी से गुजरने के लिए कुछ शेल-स्क्रिप्ट जादू कर सकते हैं क्योंकि डॉकर ने तर्क का निर्माण किया:

pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile.jenkinsAgent'
            additionalBuildArgs  '--build-arg JENKINSUID=`id -u jenkins` --build-arg JENKINSGID=`id -g jenkins` --build-arg DOCKERGID=`stat -c %g /var/run/docker.sock`'
            args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
        }
    }

यही कारण है कि का उपयोग करता है idपाने के लिए आदेश यूआईडी और GID के jenkinsउपयोगकर्ता और statआदेश डोकर सॉकेट के बारे में जानकारी प्राप्त करने के लिए।

आपका डॉकरफ़ाइल उस जानकारी का उपयोग कर सकता है जो एजेंट के लिए jenkinsउपयोगकर्ता और dockerसमूह को सेटअप करने के लिए उपयोग कर रहा है groupadd, groupmodऔर useradd:

# Dockerfile.jenkinsAgent
FROM debian:stretch-backports
ARG JENKINSUID
ARG JENKINSGID
ARG DOCKERGID
...
# Install Docker in the image, which adds a docker group
RUN apt-get -y update && \
 apt-get -y install \
   apt-transport-https \
   ca-certificates \
   curl \
   gnupg \
   lsb-release \
   software-properties-common

RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

RUN apt-get -y update && \
 apt-get -y install \
   docker-ce \
   docker-ce-cli \
   containerd.io

...
# Setup users and groups
RUN groupadd -g ${JENKINSGID} jenkins
RUN groupmod -g ${DOCKERGID} docker
RUN useradd -c "Jenkins user" -g ${JENKINSGID} -G ${DOCKERGID} -M -N -u ${JENKINSUID} jenkins

यह एक उत्कृष्ट व्यापक समाधान है और एकमात्र ऐसा है जो मेरे लिए काम करता है जब dockerfile के माध्यम से docker में साझा किए गए do सॉकेट का उपयोग किया जाता है। इसका अपना ब्लॉग पोस्ट होना चाहिए। इसके लिए धन्यवाद!
ग्रेग ओल्मस्टेड

लगता है कि आप पास हो सकते हैं -u jenkins:$(getent group docker | cut -d: -f3)?
गिलेस्पी

: जब आर्ग गुजर, यह निम्न लाइन बदलने के लिए शायद बेहतर है args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'के द्वारा args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:jenkins --group-add docker' जब -u जेनकींस गुजर: डोकर, आप प्राथमिक उपयोगकर्ता समूह है, जो मतलब बदल जब उपयोगकर्ता लिखने एक फ़ाइल, कार्यक्षेत्र में कहते हैं, यह फ़ाइल सेट हो जाएगा उपयोगकर्ता jenkins और समूह docker को। जो कि संभवत: वह नहीं है जिसका हम इरादा करते हैं।
निकोलस फोरनी

8

मेरे पास डॉकटर में जेनकींस चल रहा है और कनेक्टेड जेनकिन्स होस्ट मशीन उबंटू 16.04 से डॉकर सॉकेट का उपयोग मात्रा के माध्यम से /var/run/docker.sock में कर रहा है।

मेरे लिए समाधान था:

1) जेनकींस के डॉकटर कंटेनर के अंदर ( docker exec -it jenkins bashमेजबान मशीन पर)

usermod -a -G docker jenkins
chmod 664 /var/run/docker.sock
service jenkins restart (or systemctl restart jenkins.service)
su jenkins

2) मेजबान मशीन पर:

sudo service docker restart

664 का अर्थ है - समूह से स्वामी और उपयोगकर्ताओं के लिए पढ़ना और लिखना (लेकिन निष्पादित नहीं करना)।


यह एकमात्र समाधान है जिसके लिए लॉगिन / लॉगिन की आवश्यकता नहीं होती है, अर्थात वह समाधान जो शेल स्क्रिप्ट में इसे चलाने की कोशिश करते समय काम करता है।
पीवी

3

उत्पादन विन्यास करते समय मुझे अनुमति मुद्दा मिल गया था। मैंने समस्या को हल करने के लिए नीचे दिए गए समाधान की कोशिश की।

त्रुटि संदेश

ubuntu@node1:~$ docker run hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.38/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

समाधान: त्रुटि संदेश में संकेतित सॉकेट की अनुमति, /var/run/docker.sock:

ubuntu@ip-172-31-21-106:/var/run$ ls -lrth docker.sock
srw-rw---- 1 root root 0 Oct 17 11:08 docker.sock
ubuntu@ip-172-31-21-106:/var/run$ sudo chmod 666 /var/run/docker.sock
ubuntu@ip-172-31-21-106:/var/run$ ls -lrth docker.sock
srw-rw-rw- 1 root root 0 Oct 17 11:08 docker.sock

Docket.sock के लिए परिवर्तन की अनुमति के बाद अनुमतियों की जांच करने के लिए कमांड के नीचे निष्पादित करें।

ubuntu@ip-172-31-21-106:/var/run$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

2

मेरे मामले में, यह न केवल jenkinsउपयोगकर्ता को dockerसमूह में जोड़ने के लिए आवश्यक था , बल्कि उस समूह को jenkinsउपयोगकर्ता का प्राथमिक समूह बनाता था ।

# usermod -g docker jenkins
# usermod -a -G jenkins jenkins

जेनकिंस स्लेव नोड को फिर से कनेक्ट करने के लिए मत भूलना या जेनकिंस सर्वर को पुनरारंभ करें, अपने मामले पर निर्भर करें।


2

2019/02/16

अधिकांश कदम मेरे लिए वही थे जो दूसरों ने लिखे हैं। हालाँकि, मैं उल्लिखित समाधानों के साथ समूहकारक का उपयोग करते हुए समूह डॉक में जेनकींस को जोड़ने में सक्षम नहीं था।

मैंने डॉक होस्ट से निम्नलिखित कमांड की कोशिश की , और रनिंग डॉक कंटेनर से :

sudo usermod -a -G docker jenkins

(मैं डॉक होस्ट से निम्नलिखित कमांड के साथ रनिंग डॉक कंटेनर में प्रवेश किया :

docker exec -t -i my_container_id_or_name /bin/bash

)

डॉक होस्ट से प्राप्त :

usermod: उपयोगकर्ता 'जेनकींस' मौजूद नहीं है

डॉकटर कंटेनर से प्राप्त :

हमें विश्वास है कि आपने स्थानीय सिस्टम प्रशासक से सामान्य व्याख्यान प्राप्त किया है। यह आमतौर पर इन तीन चीजों को उबालता है:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

[sudo] jenkins के लिए पासवर्ड:

मुझे पासवर्ड नहीं पता था।

sudoकमांड के हिस्से के बिना , मुझे प्राप्त डॉकटर कंटेनर में :

usermod: अनुमति से इनकार किया। usermod: लॉक नहीं कर सकता / etc / passwd; बाद में पुन: प्रयास करें।

समाधान: मैंने निम्नलिखित कमांड के साथ डॉक होस्ट से रनिंग डॉक कंटेनर में प्रवेश किया :

docker exec -t -i -u root my_container_id_or_name /bin/bash

अब, मैंने रूट के रूप में प्रवेश किया , और निम्न आदेश जारी किया:

usermod -a -G docker jenkins

फिर, डॉक होस्ट से , मैंने निम्नलिखित कमांड के साथ अपने रनिंग डॉक कंटेनर को फिर से शुरू किया :

docker restart my_container_id_or_name

उसके बाद, मैंने जेनकिंस का काम शुरू किया और यह सफलता के साथ समाप्त हुआ।

मैंने केवल उपयोगकर्ता के लिए कमांड जारी करने के लिए रूट उपयोगकर्ता का उपयोग किया था ।usermodjenkins


2

2019/05/26

यह मेरे लिए काम किया!

उदाहरण docker- रचना:

version: "3"
services:
  jenkins:
    image: jenkinsci/blueocean
    privileged: true
    ports:
      - "8080:8080"
    volumes:
      - $HOME/learning/jenkins/jenkins_home:/var/jenkins_home
    environment:
      - DOCKER_HOST=tcp://socat:2375
    links:
      - socat

  socat:
     image: bpack/socat
     command: TCP4-LISTEN:2375,fork,reuseaddr UNIX-CONNECT:/var/run/docker.sock
     volumes:
        - /var/run/docker.sock:/var/run/docker.sock
     expose:
        - "2375"

2

मुझे एक ऐसे ही मुद्दे का सामना करना पड़ा, जो एक अनुमति मुद्दा है और इस मुद्दे का कारण यह है क्योंकि डॉकर डेमॉन / सर्वर हमेशा rootउपयोगकर्ता के रूप में चलता है , और आप हमेशा docker कमांड को प्राथमिकता देना चाहते हैं sudo

डॉकर डेमॉन एक टीसीपी पोर्ट के बजाय एक यूनिक्स सॉकेट से बांधता है। डिफ़ॉल्ट रूप से कि यूनिक्स सॉकेट उपयोगकर्ता के स्वामित्व में है rootऔर अन्य उपयोगकर्ता केवल इसका उपयोग करके एक्सेस कर सकते हैं sudo

इसे ठीक करने के लिए, यहां मेरे लिए काम किया गया है:

सबसे पहले, जांचें कि क्या आपके पास पहले से निर्मित एक docker समूह है:

cat /etc/group

यदि आपको dockerवह सूची नहीं मिलती है जो प्रदर्शित होती है, तो आपको एक बनाने की आवश्यकता होगी:

sudo groupadd docker

अगला, नीचे दिए गए आदेश का उपयोग करके अपने userऔर अपने की पुष्टि करें group:

cat /etc/group

डॉक के लिए समूह को देखने के लिए स्क्रॉल करें। यह इस प्रारूप का होना चाहिए

docker:x:140:promisepreston

मैं कहाँ dockerहूँ groupऔर promiseprestonमेरा हैuser

अब हम आपके उपयोगकर्ता को डॉकटर समूह में जोड़ सकते हैं

केवल डॉकटर कंटेनर फ़ाइलों के लिए:

अपने टर्मिनल में नीचे दिए गए कमांड को कॉपी करें और चलाएं, वैसे भी इसे बिना किसी संशोधन के बताया गया है, बिना डॉकटर इमेज / कंटेनर / कमांड के जिसे आप चलाना चाहते हैं या चलाने की कोशिश कर रहे हैं या अनुमति के मुद्दे को कम कर रहे हैं:

sudo usermod -aG docker $USER

ऊपर दिए गए आदेश को चलाने के बाद, आपको लॉग आउट करना होगा और वापस लॉग इन करना होगा ताकि आपकी समूह सदस्यता का पुनर्मूल्यांकन हो। हालाँकि, लिनक्स पर, आप समूहों में परिवर्तन को सक्रिय करने के लिए नीचे दी गई कमांड को भी चला सकते हैं ( अपने टर्मिनल में नीचे दिए गए कमांड को कॉपी और चलाएं, यह बिना किसी भी तरह से इसे संशोधित किए बिना बताया गया है, चाहे डॉक छवि / कंटेनर / कमांड की परवाह किए बिना कि आप भागना चाहते हैं या अनुमति मुद्दे को चलाने या चलाने की कोशिश कर रहे हैं ):

newgrp docker 

अब आप यह सत्यापित कर सकते हैं कि आप sudo अनुमतियों के बिना docker कमांड चला सकते हैं, उस कमांड को चलाकर, जो फिर से परमिशन इश्यू का कारण बन रही है, ( अपनी छवि / कंटेनर / कमांड के नाम से बदलेंmy-command ):

docker run my-command

डॉकर और स्थानीय फाइलसिस्टम फ़ाइलों के लिए:

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

sudo​​ ​ chown​​ ​ <your_user>:<your_group>​​ ​ -R​​ my-app-directory/

तो मेरे मामले में यह होगा:

sudo chown promisepreston:docker -R my-app-directory/

नोट: कृपया इस डायरेक्टरी को पैरेंट डायरेक्टरी हाउसिंग एप्लीकेशन डायरेक्टरी के अंदर चलाएं।

बस इतना ही।

आशा है कि ये आपकी मदद करेगा



1

मैं एक डॉकटर कंटेनर के अंदर जेनकिंस चला रहा हूं। मेरे लिए सबसे सरल उपाय एक कस्टम छवि बनाना था जो गतिशील रूप से GID सेट करती है, जैसे:

FROM jenkins/jenkins:lts
...
CMD DOCKER_GID=$(stat -c '%g' /var/run/docker.sock) && \
    groupadd -for -g ${DOCKER_GID} docker && \
    usermod -aG docker jenkins && \
    sudo -E -H -u jenkins bash -c /usr/local/bin/jenkins.sh

देखें: https://github.com/jenkinsci/docker/issues/263

वैकल्पिक रूप से आप निम्नलिखित विकल्पों के साथ जेनकींस लॉन्च कर सकते हैं:

-v /var/run/docker.sock:/var/run/docker.sock \
-u jenkins:$(getent group docker | cut -d: -f3)

यह मानता है कि आपकी जेनकिन्स छवि में डॉकटर क्लाइंट स्थापित है। देखें: https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci


1

यदि आपको नीचे की तरह त्रुटियाँ मिल सकती हैं,

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock

या

level=error msg="failed to dial gRPC: cannot connect to the Docker daemon. Is 'docker daemon' running on this host?: dial unix /var/run/docker.sock: connect: permission denied"

बस निम्नलिखित कमांड निष्पादित करने का प्रयास करें,

$ sudo su - jenkins
$ sudo usermod -a -G docker $USER
$ sudo chown jenkins:docker /var/run/docker.sock

`sudo usermod -a -G docker $ USER 'जेनकींस का पासवर्ड पूछेगा, सुनिश्चित नहीं है कि उपयोगकर्ता पासवर्ड क्या है।
3lokh

मुझे लगता है कि आपको जेनकींस उपयोगकर्ता के लिए सुडोल अनुमति देनी चाहिए। या आप रूट उपयोक्ता में निम्न कमांड के साथ कोशिश कर सकते हैं, usermod -a -G docker jenkinsऔरchown jenkins:docker /var/run/docker.sock
lakshmikandan

आपको सॉकेट के स्वामित्व को जेनकींस में नहीं बदलना चाहिए। और आपको sudo चलाना चाहिए क्योंकि सामान्य उपयोगकर्ता के पास sudo एक्सेस होता है, न कि जेनकिंस के रूप में। यह उत्तर स्वीकृत उत्तर में क्या जोड़ता है?
जिम स्टीवर्ट

1

मैं आधिकारिक जेनकींस डॉकटर छवि ( https://hub.docker.com/r/jenkins/jenkins) का उपयोग कर रहा हूं ) रहा हूं, लेकिन मुझे लगता है कि यह समाधान उन अधिकांश मामलों पर लागू है, जहां हम डॉकर कंटेनर के अंदर डॉकर चलाना चाहते हैं।

डॉकर कंटेनर के अंदर डॉकर का उपयोग करने के लिए अनुशंसित तरीका, मेजबान सिस्टम के डॉकर बधिर का उपयोग करना है। उसके बारे में अच्छा लेख: https://itnext.io/docker-in-docker-521958d34efd

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

docker exec -it -u root <container-name> bash
usermod -a -G docker <username>

करूंगा। कंटेनर को पुनरारंभ करने के लिए याद रखें।

मुझे लगता है कि इसे प्राप्त करने का सबसे सरल तरीका एक अनुकूलित डॉकफाइल बनाना है:

# Official jenkins image
FROM jenkins/jenkins:lts
# Swith to root to be able to install Docker and modify permissions
USER root
RUN apt-get update
# Install docker
RUN curl -sSL https://get.docker.com/ | sh
# Add jenkins user to docker group
RUN usermod -a -G docker jenkins
# Switch back to default user
USER jenkins

# Bild the image:
# sudo docker build -t yourusername/imagename .
# Run the image and mount with the followin bind mount option:
# sudo docker run --name imagename -d -p8080:8080 -v /var/run/docker.sock:/var/run/docker.sock yourusername/imagename

जेनकिंस छवि पर पूरे
डॉकटर

1

यदि कोई अभी भी अपने स्थानीय मशीन (उबंटू) पर समस्या का सामना कर रहा है तो नीचे दिए गए आदेश की कोशिश करें:

sudo chmod 666 /var/run/docker.sock

1

मेरे मामले में यह सफलतापूर्वक काम करेगा। अपने स्थानीय रेपो को नेविगेट करें और इस कमांड को दर्ज करें।

sudo chmod 666 /var/run/docker.sock

0

सर्वर पर जहां जेनकिन्स चल रहा है, मैंने उपयोग किया

sudo setfacl -m user:tomcat:rw /var/run/docker.sock

और फिर प्रत्येक डॉकटर कंटेनर को चलाएं

-v /var/run/docker.sock:/var/run/docker.sock

सेटफैक्ल का उपयोग करना एक बेहतर विकल्प लगता है, और किसी "-यू उपयोगकर्ता" की आवश्यकता नहीं होती है। कंटेनर फिर उसी उपयोगकर्ता के रूप में चलते हैं जो जेनकिंस चला रहे हैं। लेकिन मैं सुरक्षा विशेषज्ञों से किसी भी प्रतिक्रिया की सराहना करूंगा।


0

dockerfile के नीचे उपयोग करें

FROM jenkins/jenkins

USER root

# Install Docker
RUN apt-get update && \
    apt-get -y install apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common && \
    curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
    add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
    $(lsb_release -cs) \
    stable" && \
    apt-get update && \
    apt-get -y install docker-ce


# Compose
RUN curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose



RUN usermod -aG docker jenkins
RUN usermod -aG root jenkins

USER jenkins


0

नए उपयोगकर्ता समूह और उपयोगकर्ता पर प्रभावी होने के लिए अक्सर रिबूट की आवश्यकता होती है।


0

यदि आप एक डॉक कंटेनर के अंदर जेनकींस चला रहे हैं और आपका जेनकिन्स मेजबान डॉक से जुड़ रहा है, तो आप नीचे दिए गए डॉकरीफाइल से इसे ठीक कर सकते हैं:

FROM jenkins/jenkins:2.179
USER root
RUN groupadd docker && usermod -a -G docker jenkins
USER jenkins 

-6

हो सकता है कि आप शुरू से ही "-यू रूट" विकल्प के साथ डॉक को चलाएं

कम से कम जो मेरी समस्या का हल है


1
तब आपको उपयोगकर्ता के रूप में बनाई जा रही फाइलें मिल सकती हैं root। कम से कम इस डोकर 18.06.1 साथ, मुझे क्या हुआ है।
अर्नेस्ट डे हान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.