Docker: kreeg toestemming geweigerd tijdens het proberen verbinding te maken met de Docker Daemon-socket bij UNIX: //var/run/docker.Sock

Ik ben nieuw voor Docker. Ik heb geprobeerd om Docker in mijn lokale machine te gebruiken (Ubuntu 16.04) met Jenkins.

Ik heb een nieuwe taak geconfigureerd met onderstaande pijplijnscript.

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

Maar het mislukt met onderstaande fout.


1, Autoriteit 100%

De gebruiker jenkinsmoet worden toegevoegd aan de groep docker:

sudo usermod -a -G docker jenkins

Start Jenkins vervolgens opnieuw.

Bewerken

Als u tot deze kwestie van stapel overloop aankomt, omdat u dit bericht van Docker ontvangt, maar u geen Jenkins gebruikt, is hoogstwaarschijnlijk de fout hetzelfde: uw niet-gebruikelijke gebruiker behoort niet tot de Docker-groep.

u kunt doen:

sudo usermod -a -G docker [user]

Plaats uw gebruikersnaam waar [user]is.

U kunt controleren of het is geslaagd door grep docker /etc/groupte doen en iets als deze te zien:

docker:x:998:[user]

in een van de regels.

Wijzig vervolgens uw gebruikersgroep-ID naar docker:

newgrp docker

Eindelijk uitloggen en opnieuw inloggen


2, Autoriteit 27%

Mijn eerste oplossingen was:

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

Maar geen van hen werkt voor mij, ik heb geprobeerd:

chmod 777 /var/run/docker.sock

Dat werkt, maar ik weet niet of het de juiste oproep is.


Antwoord 3, autoriteit 11%

Succes voor mij

sudo usermod -a -G docker $USER
reboot

Antwoord 4, autoriteit 7%

2018-08-19

Ik zit hier al dagen mee vast en omdat ik geen volledig antwoord heb gevonden met het waarom en hoe, zal ik er een posten voor andere mensen die op hetzelfde probleem stuiten en antwoorden van bovenaf werken niet.

Dit zijn de 3 cruciale stappen bij het uitvoeren van Jenkins in docker:

  1. Je koppelt de socket /var/run/docker.sockaan de jenkins-container om de docker van de host te kunnen gebruiken.
  2. Je moet docker in de container installeren om het te kunnen gebruiken. Ditis een geweldige en eenvoudig artikel over hoe dat te doen. Merk op dat in nieuwere versies mogelijk al docker is geïnstalleerd
  3. Je voert sudo usermod -a -G docker jenkinsuit om jenkins aan de docker-groep toe te voegen. Hier kunt u echter een machtigingsprobleem tegenkomen als de host-docker en de container-docker niet dezelfde groeps-ID hebben, dus het is erg belangrijk om de gid van de container-docker aan te passen zodat deze hetzelfde is als de host-docker-gid

Je kunt dit doen als onderdeel van een opstartscript of gewoon door execte gebruiken en dit handmatig te doen: groupmod -g <YOUR_HOST_DOCKER_GID> docker.

Verander ook de rechten nietvan de /var/run/docker.socknaar 777 of zo, want dat is een groot veiligheidsrisico, je bent in feite iedereentoestemming geven om docker op uw computer te gebruiken

Hopelijk helpt dit


Antwoord 5, autoriteit 6%

Wijzig de toegangsrechten van het docker.sock-bestand

chmod 777 /var/run/docker.sock

of u kunt sudogebruiken aan het begin van de opdracht.

chmod 777zal alle acties voor alle gebruikers toestaan, terwijl chmod 666alle gebruikers zal toestaan om te lezen en te schrijven, maar het bestand niet kan uitvoeren.


Antwoord 6, autoriteit 3%

Ik heb de jenkins-gebruiker toegevoegd aan de rootgroep en de jenkins opnieuw opgestart en het begon te werken.

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

7, Autoriteit 2%

Methode 01: – Veiliger Methode

sudo usermod -aG docker ${USER}

Om het nieuwe groepslidmaatschap toe te passen, logt u uit bij de server en weer in, of typt u het volgende:

su - ${USER}

U wordt gevraagd uw gebruikerswachtwoord in te voeren om door te gaan.
Bevestig dat uw gebruiker nu is toegevoegd aan de koppelvenstergroep door te typen:

id -nG

Methode 02:- Niet aanbevolen voor openbare implementaties (onveilig)

chmod 777 /var/run/docker.sock

Antwoord 8, autoriteit 2%

Ik heb een soortgelijk probleem ondervonden, namelijk een permissieprobleemen de oorzaak van dit probleem is dat de Docker-daemon/server altijd draait als de root-gebruiker, en wil u moet het docker-commando altijd voorafgaan met sudo.

Docker-daemon bindt aan een Unix-socket in plaats van een TCP-poort. Standaard is die Unix-socket eigendom van de gebruiker rooten hebben andere gebruikers er alleen toegang toe met sudo.

Om dit op te lossen, heeft dit voor mij gewerkt:

Controleer eerst of u al een koppelgroep heeft aangemaakt:

cat /etc/group

Als u dockerniet vindt in de lijst die wordt weergegeven, moet u er een maken:

sudo groupadd docker

Bevestig vervolgens uw useren uw groupmet de onderstaande opdracht:

cat /etc/group

Scroll door om de groep voor docker te zien. Het moet van dit formaat zijn

docker:x:140:promisepreston

waarbij dockermijn groupis en promiseprestonmijn user

is

Nu kunnen we uw gebruiker toevoegen aan de docker-groep

Voeg uw gebruiker ook toe aan de “docker”-groep. Als u Docker als niet-rootgebruiker wilt gebruiken:

Kopieer en voer de onderstaande opdracht uit in uw terminal precies zoals deze wordt vermeld zonder deze op enigerlei wijze te wijzigen, ongeacht de docker-afbeelding/container/opdracht die u wilt uitvoeren of probeert uit te voeren of het toestemmingsprobleem veroorzaakt:

sudo usermod -aG docker $USER

Na het uitvoeren van de bovenstaande opdracht, moet je uitloggen en weer inloggen zodat je groepslidmaatschap opnieuw wordt geëvalueerd. Op Linux kunt u echter ook de volgende opdracht hieronder uitvoeren om de wijzigingen aan groepen te activeren (Kopieer en voer de onderstaande opdracht in uw terminal precies uit zoals deze wordt vermeld zonder deze op enigerlei wijze te wijzigen, ongeacht de docker-afbeelding/ container/opdracht die u wilt uitvoeren of probeert uit te voeren of het toestemmingsprobleem veroorzaakt):

newgrp docker

OF

sudo systemctl restart docker

U kunt nu controleren of u docker-opdrachten kunt uitvoeren zonder sudo-machtigingen, door de opdracht die het probleem met de machtigingen veroorzaakt opnieuw uit te voeren, bijvoorbeeld (Vervang my-commanddoor de naam van uw afbeelding/container/commando):

docker run my-command

Voor Docker- en lokale bestandssysteembestanden:

Als u een kopie van de bestanden op uw lokale bestandssysteem heeft, kunt u het eigendom van de toepassingsdirectory waarin de toepassingsbestanden zijn opgeslagen, met dit formaat wijzigen:

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

Dus in mijn geval zal het zijn:

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

Opmerking:Voer deze opdracht uit in de bovenliggende map waarin de toepassingsmap zich bevindt.

Dat is alles.

Ik hoop dat dit helpt


Antwoord 9, autoriteit 2%

Ik heb Jenkins in Docker draaien en aangesloten Jenkins gebruikt Docker-socket van hostcomputer Ubuntu 16.04 via volume naar /var/run/docker.sock.

Voor mij was de oplossing:

1) In Docker-container van Jenkins (docker exec -it jenkins bashop hostcomputer)

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

2) Op hostcomputer:

sudo service docker restart

664betekent – lezen en schrijven (maar niet uitvoeren) voor de eigenaar en gebruikers van de groep.


Antwoord 10

In mijn geval was het niet alleen nodig om een jenkins-gebruiker toe te voegen aan de docker-groep, maar om die groep de primaire groep van de jenkinste maken. gebruiker.

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

Vergeet niet om de jenkins-slave-node opnieuw te verbinden of de jenkins-server opnieuw te starten, afhankelijk van uw geval.


Antwoord 11

26-05-2019

Ditwerkte voor mij!

Voorbeeld docker-compose:

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"

Antwoord 12

Tijdens de productieconfiguratie kreeg ik het toestemmingsprobleem. Ik heb onderstaande oplossing geprobeerd om het probleem op te lossen.

Foutbericht

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'.

Oplossing:permissies van de socket aangegeven in de foutmelding, /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

Nadat de toestemming voor docket.sock is gewijzigd, voer dan onderstaande opdracht uit om de toestemmingen te controleren.

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/

Antwoord 13

Stap 1: voeg uw gebruikersnaam toe aan de groep docker:

sudo usermod -a -G docker $USER

Log dan uit en log opnieuw in.

Stap 2: Wijzig vervolgens de docker-groeps-ID:

newgrp docker

Antwoord 14

2019-02-16

De meeste stappen waren voor mij hetzelfde als de anderen hebben geschreven.
Ik kon jenkins echter niet toevoegen aan de groepsdocker met usermod met de genoemde oplossingen.

Ik heb het volgende commando geprobeerd van de docker-hosten van de running docker-container:

sudo usermod -a -G docker jenkins

(Ik ging naar de running docker containermet het volgende commando van de docker host:

docker exec -t -i my_container_id_or_name /bin/bash

)

Ontvangen van docker-host:

usermod: gebruiker ‘jenkins’ bestaat niet

Ontvangen van docker-container:

We vertrouwen erop dat u de gebruikelijke lezing van het lokale systeem hebt ontvangen
Beheerder. Het komt meestal neer op deze drie dingen:

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

[sudo] wachtwoord voor jenkins:

Ik wist het wachtwoord niet.

Zonder het sudodeel van de opdracht, in de docker-containerontving ik:

usermod: toestemming geweigerd. usermod: kan /etc/passwd niet vergrendelen; proberen
later opnieuw.

Oplossing:
Ik ging naar de running docker-containervan de docker-hostmet het volgende commando:

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

Nu heb ik het ingevoerd als rooten heb ik het volgende commando gegeven:

usermod -a -G docker jenkins

Vervolgens herstartte ik vanaf de docker-hostmijn lopende docker-containermet het volgende commando:

docker restart my_container_id_or_name

Daarna begon ik aan de jenkins-baan en het eindigde met succes.

Ik heb alleen de root-gebruiker gebruikt om de opdracht usermoduit te voeren voor de gebruiker jenkins.


Antwoord 15

Ik gebruik de officiëlejenkins docker-afbeelding (https: //hub.docker.com/r/jenkins/jenkins) maar ik denk dat deze oplossing van toepassing is op de meeste gevallen waarin we Docker in een Docker-container willen uitvoeren.

De aanbevolen manier om Docker in een Docker-container te gebruiken, is om de Docker-deamon van het hostsysteem te gebruiken. Goed artikel daarover: https://itnext.io/docker-in-docker-521958d34efd.

Het geheim om het toestemmingsprobleem, waar deze vraag over gaat, af te handelen, is om toestemmingen toe te voegen voor de gebruiker van de container in de container, niet in het hostsysteem. Alleen root-gebruikers hebben standaard rechten om dat te doen, dus

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

zal het doen. Vergeet niet om de container opnieuw op te starten.

Ik denk dat de eenvoudigste manier om dit te bereiken is om een aangepast Dockerbestand te maken:

# 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

Antwoord 16

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

Antwoord 17

Ik gebruik Jenkins in een docker-container. De eenvoudigste oplossing voor mij was om een aangepaste afbeelding te maken die de GID dynamisch instelt, zoals:

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

Zie: https://github.com/jenkinsci/docker/issues/263

U kunt ook jenkins starten met de volgende opties:

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

Hierbij wordt ervan uitgegaan dat de docker-client op uw jenkins-image is geïnstalleerd. Zie: https://getintodevops. com/blog/the-simple-way-to-run-docker-in-docker-for-ci


Antwoord 18

Als u fouten krijgt zoals hieronder,

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

of

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"

Probeer gewoon de volgende opdrachten uit te voeren,

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

Antwoord 19

In mijn geval zal dit met succes werken.
navigeer door uw lokale opslagplaats en voer deze opdracht in.

sudo chmod 666 /var/run/docker.sock

Antwoord 20

Als je Jenkins in een docker-container draait en je Jenkins linkt naar de host-docker, dan kun je dat oplossen door het onderstaande Docker-bestand te gebruiken:

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

Antwoord 21

sudo setfacl –modify user:(gebruikersnaam of ID):rw /var/run/docker.sock

Ik heb verschillende keren geprobeerd het commando uit te voeren

sudo chmod 777 /var/run/docker.sock

maar helaas moet ik dit elke keer doen als ik inlog op het ubuntu-systeem.
Het vereist geen herstart en is veiliger dan usermod of chown.
gebruikers-ID is vereist wanneer de gebruikersnaam alleen in de container bestaat, maar niet op de host.

Ik hoop dat het je zal helpen het probleem op te lossen.


Antwoord 22

Op de server waarop Jenkins draait, gebruikte ik

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

En voer vervolgens elke docker-container uit met

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

Het gebruik van setfacl lijkt een betere optie, en er is geen “-u gebruiker” nodig. De containers worden vervolgens uitgevoerd als dezelfde gebruiker die Jenkins uitvoert. Maar ik zou alle feedback van de beveiligingsexperts op prijs stellen.


Antwoord 23

gebruik onderstaand dockerbestand

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

Antwoord 24

in mijn geval was het net het starten van de docker-service :

sudo service docker start

Antwoord 25

Als iemand nog steeds met het probleem wordt geconfronteerd op zijn lokale computer (Ubuntu), probeer dan het onderstaande commando:

sudo chmod 666 /var/run/docker.sock

Antwoord 26

Als je het simpel wilt houden, gebruik dan fixdockergidop uw Docker-bestand.


Antwoord 27

Naast het toevoegen van de gebruiker aan de docker-groep en het proberen van alles wat in deze thread wordt genoemd, duurde het even voordat ik me realiseerde dat ik mijn terminal opnieuw moest opstarten en me vervolgens opnieuw moest aanmelden bij de ec2-instantie. Daarna werkte het.


Antwoord 28

Ik kon dit ook laten werken zonder de permissies op de lokale unix-socket /var/run/docker.sock te hoeven wijzigen. Wat ik moest doen, was tcp-verbindingen inschakelen op het build-agentknooppunt en vervolgens de docker-host specificeren in de Jenkins-cloudconfiguratie.

Ervan uitgaande dat u een aws-image gebruikt, ssh naar uw build-agent-knooppunt(en) en tcp-poorten inschakelen met behulp van het /etc/sysconfig/docker-bestand

Voeg de optie -H tcp://0.0.0.0:2376toe.

# Additional startup options for the Docker daemon, for example:
# OPTIONS="--ip-forward=true --iptables=true"
# By default we limit the number of open files per container
OPTIONS="-H tcp://0.0.0.0:2376 --default-ulimit nofile=1024:4096"

Zorg ervoor dat u de daemon opnieuw start met sudo service docker restart

Ten slotte moet je Jenkins vertellen dat hij standaard tcp moet gebruiken met behulp van de omgevingsvariabele DOCKER_HOST die is geconfigureerd in de configuratie van de cloudknooppunten. Let op: dit is geen configuratie in de Jenkins-pijplijnomgeving.

Navigeer naar Jenkins -> Jenkins beheren -> Cloud en knooppunten beheren -> Sommige configuraties ->
Knooppunteigenschappen -> Omgevingsvariabelen

Voeg vervolgens uw omgevingsvariabele DOCKER_HOST toe.

OPMERKING:ik gebruik Launch-agents via ssh om dit te laten werken.


Antwoord 29

vaak opnieuw opstarten nodig om effect te hebben op de nieuwe gebruikersgroep en gebruiker.

Other episodes