วิธีแก้ไขตัวเทียบท่า: ได้รับการปฏิเสธปัญหา


306

ฉันติดตั้ง Docker ในเครื่องที่ฉันใช้ Ubuntu OS หลังจากฉันติดตั้งนักเทียบท่าเมื่อฉันทำงาน

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

คำตอบ:


444

หากคุณต้องการเรียกใช้นักเทียบท่าในฐานะผู้ใช้ที่ไม่ใช่รูทคุณต้องเพิ่มลงในกลุ่มนักเทียบท่า

  1. สร้างกลุ่มนักเทียบท่าหากไม่มีอยู่
$ sudo groupadd docker
  1. เพิ่มผู้ใช้ของคุณไปยังกลุ่มนักเทียบท่า
$ sudo usermod -aG docker $USER
  1. เรียกใช้คำสั่งต่อไปนี้หรือออกจากระบบและเข้าสู่ระบบอีกครั้งและเรียกใช้ (ที่ไม่ทำงานคุณอาจต้องรีบูตเครื่องของคุณก่อน)
$ newgrp docker
  1. ตรวจสอบว่านักเทียบท่าสามารถทำงานได้โดยไม่ต้องรูท
$ docker run hello-world

นำมาจากเอกสารอย่างเป็นทางการของนักเทียบท่า: Manage-docker-as-a-non-root-user


70
ฉันยังคงมีปัญหานี้หลังจากดำเนินการทั้งสามขั้นตอน "(
Anand

78
ฉันต้องรีบูทบน Ubuntu 18 เพื่อให้ใช้งานได้ - เพียงแค่ล็อกเอาต์และการล็อกอินกลับใช้งานไม่ได้
heez

26
@heez รีบูตอาจไม่จำเป็นต้องใช้รีสตาร์ท Docker ก็เพียงพอแล้วสำหรับฉัน sudo systemctl restart docker
Rattle

5
โปรดทราบว่าการอยู่ในdockerกลุ่มเป็นหลักให้สิทธิ์การเข้าถึงรูทโดยไม่บังคับใช้นโยบาย sudo และการตรวจสอบตามปกติ ดู GitHub ปัญหา # 9976สำหรับรายละเอียดและการสนทนา
raehik

13
การเริ่มระบบใหม่นักเทียบท่าไม่ทำงานสำหรับฉันเฉพาะการรีบูตเท่านั้น (Ubuntu 18.04)
Joakim Tall

360

หลังจากอัปเกรดฉันได้รับอนุญาตปฏิเสธ การทำตามขั้นตอนของการติดตั้งโพสต์ 'mkb' นั้นไม่มีอะไรเปลี่ยนแปลงเพราะผู้ใช้ของฉันอยู่ในกลุ่ม 'นักเทียบท่า' อยู่แล้ว ฉันลองอีกครั้งสองครั้ง แต่ไม่ประสบความสำเร็จ

หลังจากผ่านไปหนึ่งชั่วโมงการค้นหาวิธีแก้ไขปัญหาต่อไปนี้จะใช้งานได้:

sudo chmod 666 /var/run/docker.sock

วิธีการแก้ปัญหามาจากOlshansk

ดูเหมือนว่าการอัปเกรดจะสร้างซ็อกเก็ตใหม่โดยไม่ได้รับอนุญาตเพียงพอสำหรับกลุ่ม 'นักเทียบท่า'

ปัญหาที่เกิดขึ้น

นี้ยากchmodรักษาความปลอดภัยหลุมเปิดและหลังจากรีบูตแต่ละข้อผิดพลาดนี้เริ่มต้นอีกครั้งและอีกครั้งและคุณจะต้องอีกครั้งรันคำสั่งดังกล่าวข้างต้นในแต่ละครั้ง ฉันต้องการทางออกทันทีและสำหรับทั้งหมด เพื่อให้คุณมีสองปัญหา:

  • 1) ปัญหาเกี่ยวกับSystemD : ซ็อกเก็ตจะถูกสร้างขึ้นเฉพาะกับเจ้าของ 'ราก' และกลุ่ม 'ราก'

    คุณสามารถตรวจสอบปัญหาแรกนี้ด้วยคำสั่งนี้:

    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 ฉันได้ติดตั้ง docker หลายครั้ง 'ตามหมอ' ฉันคิดว่าปัญหามาจากการมีปฏิสัมพันธ์ที่ไม่ดีกับแพ็คเกจอื่นที่ไม่ปรากฏชื่อ
กาแล็กซี่

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 การพักผ่อนและการเพิ่มกลุ่มคนไม่ได้เป็นอย่างนั้น
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. เปลี่ยนการอนุญาตของซ็อกเก็ตนักเทียบท่าเพื่อให้สามารถเชื่อมต่อกับนักเทียบท่า daemon /var/run/docker.sock
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) เป็นหายนะด้านความปลอดภัย ... ไม่ควรแนะนำสิ่งนี้
Aayla Secura

6

ได้รับอนุญาตปฏิเสธขณะพยายามเชื่อมต่อกับซ็อกเก็ต Docker daemon ที่ unix: ///var/run/docker.sock: รับhttp: //%2Fvar%2Frun%2Fdocker.sock/v1.40/images/json : dial unix /var/run/docker.sock: เชื่อมต่อ: สิทธิ์ถูกปฏิเสธ

sudo chmod 666 /var/run/docker.sock

วิธีนี้แก้ไขปัญหาของฉัน


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! ขอบคุณสำหรับความคิดเห็นของคุณ! ฉันทำแผนที่เพื่ออ้างอิงวิธีแก้ปัญหาของคุณ ขอบคุณมาก!
Carlos Andres

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

พวกอย่างจริงจัง อย่าเพิ่มนักเทียบท่าในกลุ่มของคุณหรือแก้ไขตำแหน่งของซ็อกเก็ต (โดยไม่ต้องเสริม SELinux) มันเป็นวิธีที่ง่ายในการสร้างความเป็นส่วนตัวของรูท เพียงเพิ่มนามแฝงใน. bashrc ของคุณก็ง่ายขึ้นและปลอดภัยขึ้นเป็น: alias dc = 'sudo docker'


1

คุณสามารถทำตามขั้นตอนเหล่านี้และมันจะใช้ได้ผลสำหรับคุณ:

  1. สร้างกลุ่มนักเทียบท่า sudo groupadd docker
  2. เพิ่มผู้ใช้ของคุณในกลุ่มนี้ sudo usermod -aG docker $USER
  3. แสดงรายการกลุ่มเพื่อให้แน่ใจว่ากลุ่มนักเทียบท่าสร้างเสร็จเรียบร้อยแล้วโดยการรันคำสั่งนี้ groups
  4. เรียกใช้คำสั่งต่อไปนี้เพื่อเปลี่ยนเซสชันสำหรับกลุ่มนักเทียบท่า newgrp docker
  5. เปลี่ยนความเป็นเจ้าของกลุ่มสำหรับ file docker.socksudo chown root:docker /var/run/docker.sock
  6. เปลี่ยนความเป็นเจ้าของสำหรับไดเรกทอรี .ocker sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
  7. ในที่สุด sudo chmod g+rwx "$HOME/.docker" -R

หลังจากการทดสอบนั้นคุณสามารถเรียกใช้ docker ps -a


ฉันต้องการคำตอบที่ไม่ต้องรีบูตเครื่อง นี่เป็นคำตอบเดียวที่ให้ไว้ "เคล็ดลับ" คือไปchownยังไฟล์ docker.sock
Potherca

1

หลังจากคุณติดตั้งนักเทียบท่าสร้างกลุ่ม 'นักเทียบท่า' แล้วเพิ่มผู้ใช้เข้าไปแก้ไขไฟล์หน่วยบริการนักเทียบท่า:

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

หลังจากการติดตั้ง Docker บน 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
มันไม่ปลอดภัยมากที่จะใช้วิธีนี้ อ่านคำแนะนำหลังการติดตั้งที่ให้ไว้ในความคิดเห็นในคำถามหลัก
Alejandro Visiedo García
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.