Як виправити докер: У дозволі відмовлено у видачі


300

Я встановив Docker у своїй машині, де є ОС Ubuntu. Після того, як я встановив докер, коли я запускаю

sudo docker run hello-world

Все нормально, але я хочу приховати слово, sudoщоб зробити коротшу команду.

Якщо я напишу команду без слова sudo

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

Це сталося те саме, коли я намагаюся зробити

docker-compose up

Як я можу це вирішити?


1
Можливий дублікат Running docker без
судо

Відповіді:


437

Якщо ви хочете запустити docker як некористувацький користувач, то вам потрібно додати його до групи докерів.

  1. Створіть групу докерів, якщо її немає
$ sudo groupadd docker
  1. Додайте свого користувача до групи докерів.
$ sudo usermod -aG docker $USER
  1. Запустіть таку команду або Вихід та увійдіть знову та запустіть (це не працює, можливо, спочатку потрібно перезавантажити машину)
$ newgrp docker
  1. Перевірте, чи може докер можна запускати без root
$ docker run hello-world

Взяте з офіційної документації докера: керуйте-docker-as-a-non-root-user


70
У мене все ще є ця проблема після виконання всіх трьох кроків "(
Ананд

78
Мені довелося перезавантажити Ubuntu 18, щоб він працював - просто вихід із системи та вхід у систему не працювали.
heez

26
@heez перезавантаження, можливо, не знадобилося, для мене було достатньо перезапустити докер. sudo systemctl restart docker
Брязкальця

5
Зауважте, що присутність у dockerгрупі по суті надає кореневий доступ , не застосовуючи регулярних політик sudo та аудиту. Деталі та обговорення див. У випуску GitHub №9976 .
raehik

13
Перезапуск докера для мене не працював,
Joakim Tall

359

Після оновлення мені отримали відмову в дозволі. Виконання кроків "mkb" після встановлення нічого не змінить, оскільки мій користувач вже був у групі "docker"; Я повторюю це двічі без будь-якого успіху.

Після години пошуку це рішення остаточно спрацювало:

sudo chmod 666 /var/run/docker.sock

Рішення надійшло з Ольшанська .

Подивіться, що оновлення відтворило сокет без достатнього дозволу для групи "docker".

Проблеми

Цей жорсткий chmod відкритий отвір у захисті і після кожного перезавантаження ця помилка запускається знову і знову, і вам доведеться кожного разу виконувати вищезазначену команду. Я хочу раз і назавжди рішення. Для цього у вас є дві проблеми:

  • 1) Проблема зSystemD : Сокет створюватиметься лише з власником 'root' та групою 'root'.

    Ви можете перевірити цю першу проблему за допомогою цієї команди:

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

    Якщо все це добре, ви повинні побачити root/docker"не root/root".

  • 2) Проблема з графічним входом : /superuser/1348196/why-my-linux-account-only-belongs-to-one-group

    Ви можете перевірити цю другу проблему за допомогою цієї команди:

    groups
    

    Якщо все правильно, ви повинні побачити групу докерів у списку. Якщо не спробувати команду

    sudo su $USER  -c groups
    

    якщо ви бачите, то група докерів це через помилку.

Рішення

Якщо вам вдасться вирішити обхід графічного входу, слід виконати наступну роботу:

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

Але якщо ви не можете керувати цією помилкою, не таким поганим рішенням може стати таке:

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

Це працює, тому що ви перебуваєте в графічному оточенні та, мабуть, єдиний користувач на вашому комп’ютері. В обох випадках вам потрібна перезавантаження (або sudo chmod 666 /var/run/docker.sock)


2
якщо докер був встановлений відповідно до doc на docs.docker.com/install, вам ніколи не потрібно мати справу з такими командами
Scott Stensland

4
@Scott Stensland Я встановлюю докер багато разів "відповідно до документа". Я думаю, що проблема виникає через погану взаємодію з іншим невідомим пакетом.
Галігатор

1
У docker-in-docker я неправильно монтував /var/run/docker.sock від хоста без :roкінця ... щойно я додав, що мені добре йти
jakebrinkmann

2
Я використовую ubuntu 18 на EC2 - AWS і бажано працював. Усі інші (sudo usermod -aG docker $ USER та інші речі) не працювали
cherah30

1
Дякуємо, це виправлено в Ubuntu 18.04 LTS. перезавантаження та додавання до groud не зробили
Deepansh Parmani

32
  1. Додати групу докерів
$ sudo groupadd docker
  1. Додайте поточного користувача до докерної групи
$ sudo usermod -aG docker $USER
  1. Перехід сеансу на групу докера
$ newgrp - docker
  1. Спробуйте приклад для тестування
$ docker run hello-world

newgrpКоманда буде запропоновано вказати пароль і не приймає мій пароль користувача. Натомість su - $USERпрацювали, щоб уникнути виходу / входу.
bluenote10

18
  1. Додати поточного користувача до dockerгрупи
sudo usermod -aG docker $USER
  1. Змініть дозволи докерного сокета, щоб мати можливість підключитися до демон-докера /var/run/docker.sock
sudo chmod 666 /var/run/docker.sock

15

Я вирішую цю помилку за допомогою команди:

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

9

Ви завжди можете спробувати Manage Docker as a non-root userабзац у https://docs.docker.com/install/linux/linux-postinstall/ docs.

Зробивши це також, якщо проблема не зникає, ви можете виконати наступну команду для її вирішення:

sudo chmod 666 /var/run/docker.sock

2
Зробити розетку докера зрозумілою чи доступною для всіх (з chmod 666) - це катастрофа безпеки ... Це ніколи не слід рекомендувати.
Айла Секура


2

Щоб вирішити цю проблему, я шукав, де встановлений мій докер і докер-композит. У моєму випадку він dockerбув встановлений /usr/bin/dockerі docker-composeвстановлений у /usr/local/bin/docker-composeшляху. Потім я записую це в свій термінал:

Докері:

sudo chmod +x /usr/bin/docker

До docker-compose:

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

Тепер мені не потрібно писати в свої команди докер слово sudo

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

ПОМИЛКА:

Найкраще рішення цього питання прокоментував @mkasberg. Цитую коментар:

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/

Дуже дякую!


2
Це може спрацювати, ви можете зіткнутися з проблемами в дорозі. Крім того, це вразливість безпеки. Вам буде краще просто додати себе до dockerгрупи, як кажуть документи. sudo groupadd docker, sudo usermod -aG docker $USER.
mkasberg

Гей, @mkasberg! Дякуємо за Ваш коментар! Я зробив помилку, щоб цитувати ваше рішення. Дуже дякую!
Карлос Андрес

1

корабель lightdm і kwallet з помилкою, яка, здається, не проходить додаткові групи при вході. Щоб вирішити це, мені теж поруч sudo usermod -aG docker $USERдовелося прокоментувати

auth optional pam_kwallet.so
auth optional pam_kwallet5.so

до

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

в /etc/pam.d/lightdm перед перезавантаженням , для Докер-групи насправді мають ефект.

помилка: https://bugs.launchpad.net/lightdm/+bug/1781418 і тут: https://bugzilla.redhat.com/show_bug.cgi?id=1581495



1

Серйозно хлопці. Не додайте Docker у свої групи і не змінюйте позікс сокета (без загартування SELinux), це простий спосіб зробити кореневий privesc. Просто додайте псевдонім у свій .bashrc, він простіший і безпечніший як: alias dc = 'sudo docker'.


1

ви можете виконати наступні кроки, і це допоможе вам:

  1. створити групу докерів sudo groupadd docker
  2. додати свого користувача до цієї групи sudo usermod -aG docker $USER
  3. перерахуйте групи, щоб переконатися, що група докерів успішно створена за допомогою виконання цієї команди groups
  4. виконайте таку команду, щоб також змінити сеанс для докерної групи newgrp docker
  5. змінити власність групи на файл docker.socksudo chown root:docker /var/run/docker.sock
  6. змінити право власності на .docker каталог sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
  7. нарешті sudo chmod g+rwx "$HOME/.docker" -R

Після цього тесту можна запустити docker ps -a


Я хотів відповіді, яка не потребує перезавантаження. Це була єдина відповідь, яка передбачала це. "Трюк" полягає chownу файлі docker.sock.
Potherca

1

Після того, як ви встановили докер, створили групу "docker" та додали до неї користувача, відредагуйте файл сервісного блоку docker:

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

Додайте два рядки до розділу [Сервіс]:

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

Збережіть файл (Ctrl-X, y, Enter)

Запустіть і ввімкніть службу Docker:

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

0

Після встановлення Докера на Centos. Під час виконання команди нижче я отримав помилку нижче.

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

Змінення групи та дозволу на 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 ~]$

Перевірте, скориставшись командою docker нижче

[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

це допомогло мені, коли я отримував помилки навіть для входу в докер, але тепер це працює в моїй системі зовсім чудово.


1
Дуже небезпечно використовувати цей метод. Перегляньте інструкції після встановлення, які були надані до коментарів у головному запитанні.
Алехандро Вісідо Гарсія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.