Comment réparer Docker: Problème d'autorisation refusée


304

J'ai installé Docker sur ma machine où j'ai Ubuntu OS. Après que j'ai installé docker, quand je cours

sudo docker run hello-world

Tout va bien, mais je veux cacher le mot sudopour raccourcir la commande.

Si j'écris la commande sans le mot sudo

docker run hello-world

Cela affiche les éléments suivants:

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.35/containers/create: dial unix /var/run/docker.sock: connect: permission denied.See 'docker run --help'.

C'est arrivé la même chose quand j'essaye de faire

docker-compose up

Comment puis-je résoudre ça?



Réponses:


440

Si vous souhaitez exécuter Docker en tant qu'utilisateur non root, vous devez l'ajouter au groupe Docker.

  1. Créez le groupe de dockers s'il n'existe pas
$ sudo groupadd docker
  1. Ajoutez votre utilisateur au groupe Docker.
$ sudo usermod -aG docker $USER
  1. Exécutez la commande suivante ou Déconnectez-vous et connectez-vous à nouveau et exécutez (cela ne fonctionne pas, vous devrez peut-être redémarrer votre ordinateur en premier)
$ newgrp docker
  1. Vérifiez si Docker peut être exécuté sans root
$ docker run hello-world

Tiré de la documentation officielle de docker: manage-docker-as-a-non-root-user


70
J'ai toujours ce problème après avoir exécuté les trois étapes "(
Anand

78
J'ai dû redémarrer Ubuntu 18 pour que cela fonctionne - la simple déconnexion et la reconnexion ne fonctionnaient pas.
heez

26
@heez un redémarrage n'a peut-être pas été nécessaire, le redémarrage de docker m'a suffi. sudo systemctl restart docker
Hochet

5
Veuillez noter qu'être dans le dockergroupe accorde essentiellement un accès root , sans appliquer les politiques et audits sudo réguliers. Voir le numéro 9976 de GitHub pour plus de détails et une discussion.
raehik

13
Le redémarrage du docker n'a pas fonctionné pour moi, seul le redémarrage a fonctionné (Ubuntu 18.04)
Joakim Tall

360

Après une mise à niveau, l'autorisation m'a été refusée. Faire les étapes des étapes de post-installation de «mkb» n'ont rien changé car mon utilisateur était déjà dans le groupe «docker»; Je recommence deux fois sans succès.

Après une heure de recherche, cette solution suivante a finalement fonctionné:

sudo chmod 666 /var/run/docker.sock

La solution est venue d' Olshansk .

On dirait que la mise à niveau a recréé le socket sans autorisation suffisante pour le groupe 'docker'.

Problèmes

Ce chmod dur ouvre un trou de sécurité et après chaque redémarrage, cette erreur recommence encore et encore et vous devez réexécuter la commande ci-dessus à chaque fois. Je veux une solution une fois pour toutes. Pour cela vous avez deux problèmes:

  • 1) Problème avecSystemD : Le socket sera créé uniquement avec le propriétaire 'root' et le groupe 'root'.

    Vous pouvez vérifier ce premier problème avec cette commande:

    ls -l /lib/systemd/system/docker.socket
    

    Si tout cela est bon, vous devriez voir root/docker«non root/root».

  • 2) Problème de connexion graphique : /superuser/1348196/why-my-linux-account-only-belongs-to-one-group

    Vous pouvez vérifier ce deuxième problème avec cette commande:

    groups
    

    Si tout est correct, vous devriez voir le groupe de dockers dans la liste. Sinon essayez la commande

    sudo su $USER  -c groups
    

    si vous voyez alors le groupe docker c'est à cause du bug.

Solutions

Si vous parvenez à obtenir une solution de contournement pour la connexion graphique, cela devrait faire le travail:

sudo chgrp docker /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket

Mais si vous ne pouvez pas gérer ce bogue, une solution pas si mauvaise pourrait être la suivante:

sudo chgrp $USER /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket

Cela fonctionne parce que vous êtes dans un environnement graphique et probablement le seul utilisateur de votre ordinateur. Dans les deux cas, vous avez besoin d'un redémarrage (ou d'un sudo chmod 666 /var/run/docker.sock)


2
si docker a été installé conformément à la doc sur docs.docker.com/install, vous n'avez jamais besoin de traiter de telles commandes
Scott Stensland

4
@Scott Stensland J'ai installé docker plusieurs fois «selon la doc». Je pense que le problème vient d'une mauvaise interaction avec un autre paquet non identifié.
Galigator

1
Dans docker-in-docker, je montais incorrectement /var/run/docker.sock à partir de l'hôte sans la :rofin ... dès que j'ai ajouté que j'étais
prêt

2
J'utilise Ubuntu 18 sur EC2 - AWS et j'ai parfaitement travaillé. Tous les autres (sudo usermod -aG docker $ USER et autres) n'ont pas fonctionné
cherah30

1
Merci, il a été corrigé dans Ubuntu 18.04 LTS. ne pas reformuler et ajouter à
groud

32
  1. Ajouter un groupe de dockers
$ sudo groupadd docker
  1. Ajoutez votre utilisateur actuel au groupe Docker
$ sudo usermod -aG docker $USER
  1. Basculer la session vers le groupe de dockers
$ newgrp - docker
  1. Exécuter un exemple pour tester
$ docker run hello-world

La newgrpcommande a demandé un mot de passe et n'a pas accepté mon mot de passe utilisateur. Au lieu de cela, a su - $USERtravaillé pour éviter de se déconnecter / se connecter.
bluenote10

18
  1. Ajouter l'utilisateur actuel au dockergroupe
sudo usermod -aG docker $USER
  1. Modifier les autorisations du socket Docker pour pouvoir se connecter au démon Docker /var/run/docker.sock
sudo chmod 666 /var/run/docker.sock

15

Je résous cette erreur avec la commande:

$ sudo chmod 666 /var/run/docker.sock

9

Vous pouvez toujours essayer le Manage Docker as a non-root userparagraphe dans les https://docs.docker.com/install/linux/linux-postinstall/ docs.

Après avoir fait cela également si le problème persiste, vous pouvez exécuter la commande suivante pour le résoudre:

sudo chmod 666 /var/run/docker.sock

2
Rendre la prise Docker lisible ou accessible en écriture à tout le monde (avec chmod 666) est un désastre de sécurité ... Cela ne devrait jamais être recommandé.
Aayla Secura


2

Pour résoudre ce problème, j'ai cherché où mon docker et docker-compose sont installés. Dans mon cas, a dockerété installé dans /usr/bin/dockeret a docker-composeété installé dans/usr/local/bin/docker-compose chemin. Ensuite, j'écris ceci dans mon terminal:

Pour docker:

sudo chmod +x /usr/bin/docker

À docker-compose:

sudo chmod +x /usr/local/bin/docker-compose

Maintenant, je n'ai pas besoin d'écrire dans mon menu fixe de commandes le mot sudo

/ ************************************************* ********************** /

ERRATA:

@Mkasberg a commenté la meilleure solution à ce problème. Je cite un commentaire:

That might work, you might run into issues down the road. Also, it's a security vulnerability. You'd be better off just adding yourself to the docker group, as the docs say. sudo groupadd docker, sudo usermod -aG docker $USER. Docs: https://docs.docker.com/install/linux/linux-postinstall/

Merci beaucoup!


2
Cela pourrait fonctionner, vous pourriez rencontrer des problèmes sur la route. C'est également une vulnérabilité de sécurité. Vous feriez mieux de simplement vous ajouter au dockergroupe, comme le disent les docs. sudo groupadd docker, sudo usermod -aG docker $USER.
mkasberg

Salut @mkasberg! Merci pour votre commentaire! J'ai fait un errata pour citer votre solution. Merci beaucoup!
Carlos Andres

1

lightdm et kwallet sont livrés avec un bogue qui semble ne pas passer les groupes supplémentaires lors de la connexion. Pour résoudre cela, je devais aussi, à côté sudo usermod -aG docker $USER, commenter

auth optional pam_kwallet.so
auth optional pam_kwallet5.so

à

#auth optional pam_kwallet.so
#auth optional pam_kwallet5.so

dans /etc/pam.d/lightdm avant de redémarrer , pour le docker groupe d'avoir fait effet.

bug: https://bugs.launchpad.net/lightdm/+bug/1781418 et ici: https://bugzilla.redhat.com/show_bug.cgi?id=1581495


1

utilisez cette commande

sudo usermod -aG docker $USER

puis redémarrez votre ordinateur, cela a fonctionné pour moi.


1

Sérieusement les gars. N'ajoutez pas Docker dans vos groupes ou ne modifiez pas le socket posix (sans durcir SELinux), c'est un moyen simple de faire un root privesc. Ajoutez simplement un alias dans votre .bashrc, c'est plus simple et plus sûr comme: alias dc = 'sudo docker'.


1

vous pouvez suivre ces étapes et cela fonctionnera pour vous:

  1. créer un groupe de dockers sudo groupadd docker
  2. ajoutez votre utilisateur à ce groupe sudo usermod -aG docker $USER
  3. répertorier les groupes pour vous assurer que le groupe de dockers a été créé avec succès en exécutant cette commande groups
  4. exécutez également la commande suivante pour modifier la session du groupe de dockers newgrp docker
  5. changer la propriété du groupe pour le fichier docker.socksudo chown root:docker /var/run/docker.sock
  6. changer la propriété du répertoire .docker sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
  7. enfin sudo chmod g+rwx "$HOME/.docker" -R

Après ce test, vous pouvez exécuter docker ps -a


Je voulais une réponse qui ne nécessite pas de redémarrage. C'était la seule réponse qui fournissait cela. L'astuce consiste à chowntrouver le fichier docker.sock.
Potherca

1

Après avoir installé Docker, créé le groupe 'Docker' et ajouté un utilisateur, modifiez le fichier d'unité de service Docker:

sudo nano /usr/lib/systemd/system/docker.service

Ajoutez deux lignes dans la section [Service]:

SupplementaryGroups=docker    
ExecStartPost=/bin/chmod 666 /var/run/docker.sock

Enregistrez le fichier (Ctrl-X, y, Entrée)

Exécutez et activez le service Docker:

sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl enable docker

0

Après l'installation de Docker sur Centos. Lors de l'exécution de la commande ci-dessous, j'ai obtenu une erreur ci-dessous.

[centos@aiops-dev-cassandra3 ~]$ 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.soc k/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

Modifier le groupe et l'autorisation pour docker.socket

[centos@aiops-dev-cassandra3 ~]$ ls -l /lib/systemd/system/docker.socket
-rw-r--r--. 1 root root 197 Nov 13 07:25 /lib/systemd/system/docker.socket
[centos@aiops-dev-cassandra3 ~]$ sudo chgrp docker /lib/systemd/system/docker.socket
[centos@aiops-dev-cassandra3 ~]$ sudo chmod 666 /var/run/docker.sock
[centos@aiops-dev-cassandra3 ~]$ ls -lrth /var/run/docker.sock
srw-rw-rw-. 1 root docker 0 Nov 20 11:59 /var/run/docker.sock
[centos@aiops-dev-cassandra3 ~]$

Vérifiez en utilisant la commande docker ci-dessous

[centos@aiops-dev-cassandra3 ~]$ 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/

[centos@aiops-dev-cassandra3 ~]$

-4

sudo chmod 666 /var/run/docker.sock

cela m'a aidé pendant que j'obtenais une erreur, même pour me connecter au docker. Mais maintenant, cela fonctionne parfaitement dans mon système.


1
Il n'est pas sûr d'utiliser cette méthode. Consultez les instructions de post-installation fournies dans les commentaires de la question principale.
Alejandro Visiedo García
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.