Docker: Mendapat izin saat mencoba terhubung ke soket daemon Docker di unix: ///var/run/docker.sock

175

Saya baru mengenal buruh pelabuhan. Saya baru saja mencoba menggunakan buruh pelabuhan di mesin lokal saya (Ubuntu 16.04) dengan Jenkins.

Saya mengkonfigurasi pekerjaan baru dengan skrip pipeline di bawah ini.

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

Tetapi gagal dengan kesalahan di bawah ini.

masukkan deskripsi gambar di sini

Ponsuyambu Velladurai
sumber
1
apakah itu Jenkins monolitik atau memiliki pengaturan master-slave? Periksa dengan pengguna yang Anda jalankan perintah buruh pelabuhan memeriksa. Lihat apakah /var/run/docker.sock memiliki akses RW ke grup.
Ram Kamath
2
langkah-langkah pasca-instalasi buruh pelabuhan: docs.docker.com/install/linux/linux-postinstall/…
radistao

Jawaban:

294

Pengguna jenkinsperlu ditambahkan ke grup docker:

sudo usermod -a -G docker jenkins

Kemudian restart Jenkins.

Edit

Jika Anda sampai pada pertanyaan stack overflow ini karena Anda menerima pesan ini dari buruh pelabuhan, tetapi Anda tidak menggunakan jenkins, kemungkinan besar kesalahannya sama: pengguna Anda yang tidak memiliki hak milik tidak termasuk dalam kelompok buruh pelabuhan.

Anda dapat melakukan:

sudo usermod -a -G docker alice

atau apa pun nama pengguna Anda.

Anda dapat memeriksanya pada akhirnya grep docker /etc/groupdan melihat sesuatu seperti ini:

docker:x:998:alice

di salah satu garis.

Kemudian ubah ID grup pengguna Anda menjadi docker:

newgrp docker
austingray
sumber
88
dan pengguna relogin
Ilya Kolesnikov
8
Jawaban yang bagus, tetapi untuk lebih umum kita bisa melakukan ini: sudo usermod -a -G docker $USERdan logout atau reboot. link
Julien Nyambal
10
Saya harus me-restart server saya agar ini benar-benar berfungsi.
etagwerker
3
Saya harus memutuskan / menghubungkan kembali node saya agar ini berfungsi (mereka terhubung melalui ssh)
GaspardP
28
Tidak perlu login lagi, cukup gunakan newgrp dockerdi sesi terminal yang sama.
C14L
69

Solusi pertama saya adalah:

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

Tapi tidak ada yang bekerja untuk saya, saya mencoba:

chmod 777 /var/run/docker.sock

Itu berhasil, tapi saya tidak tahu apakah itu panggilan yang tepat.

Kevin Garay
sumber
4
Alasan mengapa itu gagal mungkin karena Anda harus membuka kembali terminal. Gagal setelah melakukan 664, tetapi kemudian saya membuka shell baru itu berhasil.
Pemain layar
1
Saya mencoba membuka kembali, tetapi mulai bekerja hanya setelah chmod terakhir 777
ironis
masalahnya adalah bahwa setelah reboot 777 diatur ulang ke 660. Apa yang memperbaiki masalah bagi saya adalah 'usermod -aG users jenkins'.
ironis
Saya menyadari itu telah diatur ulang, tetapi jangan mengatur izin docker.sock ke 777. Ini memberi siapa pun root pada sistem Anda. Mereka dapat berbicara dengan buruh pelabuhan dan membuat wadah istimewa tanpa batasan.
Lance Hudson
3
Meskipun ini bekerja untuk penulis dan bahkan bagi saya, memberikan lebih banyak akses ke docker.sockfile bukan solusi terbaik, Anda hanya perlu menjalankan usermod... instruksi, dan kemudian reboot sistem Anda, jika tidak maka tidak akan berpengaruh
Mariano Ruiz
32

Sukses buat saya

sudo usermod -a -G docker $USER
reboot
shellhub
sumber
4
tidak perlu reboot. Logout lalu login lagi. Saya berbicara tentang usermod
Abdennour TOUMI
1
Di Ubuntu 18.04, saya harus reboot agar pengaturannya berfungsi.
Nikhil
1
Di Ubuntu 20.04 saya perlu reboot. Sesi tutup tidak cukup.
framontb
Atau jalankan su $ {USER} alih-alih keluar
goonerify
19

2018-08-19

Saya telah terjebak selama berhari-hari dalam hal ini dan karena saya belum menemukan jawaban lengkap dengan mengapa dan bagaimana, saya akan memposting satu untuk orang lain yang tersandung pada masalah yang sama dan jawaban dari atas tidak berfungsi.

Ini adalah 3 langkah penting ketika menjalankan Jenkins di dalam docker:

  1. Anda memasang soket /var/run/docker.sockke wadah jenkins agar dapat menggunakan buruh pelabuhan dari tuan rumah.
  2. Anda harus menginstal buruh pelabuhan di dalam wadah untuk menggunakannya. Ini adalah artikel yang bagus dan sederhana tentang cara melakukannya. Perhatikan bahwa versi yang lebih baru mungkin sudah menginstal buruh pelabuhan
  3. Anda menjalankan sudo usermod -a -G docker jenkinsuntuk menambahkan jenkins ke grup buruh pelabuhan. Namun, di sini Anda mungkin mengalami masalah izin jika buruh pelabuhan tuan rumah dan buruh pelabuhan kontainer tidak memiliki id grup yang sama sehingga sangat penting untuk menyesuaikan gid docker kontainer agar sama dengan gid docker host

Anda dapat melakukan ini sebagai bagian dari script peluncuran atau hanya dengan menggunakan execdan melakukannya secara manual: groupmod -g <YOUR_HOST_DOCKER_GID> docker.

Juga, tidak mengubah hak akses dari /var/run/docker.sockke 777 atau hal-hal seperti itu karena itu adalah resiko keamanan besar, Anda pada dasarnya memberikan semua orang izin untuk penggunaan buruh pelabuhan pada mesin Anda

Semoga ini membantu

Urosh T.
sumber
1
Terima kasih - perhatikan bahwa untuk gambar Jenkins Docker saat ini, perintah docker sudah diinstal (dan apt-get tidak.) Poin Anda yang lain - menambahkan Jenkins ke grup yang tepat dan memastikan GID cocok dengan yang dari host Docker, tetap tepat.
Steve Bonds
1
Menyelamatkan hidup saya dengan masalah id grup. Terima kasih!
lenkovi
13

Saya menambahkan pengguna jenkins ke grup root dan me-restart jenkins dan mulai bekerja.

sudo usermod -a -G root jenkins
sudo service jenkins restart
Ponsuyambu Velladurai
sumber
16
Ini adalah praktik keamanan yang buruk. Pendekatan yang disukai adalah jawaban ini .
kevindaub
11

Ubah izin akses file docker.sock

chmod 777 /var/run/docker.sock

atau Anda dapat menggunakan sudodi awal perintah.

chmod 777akan memungkinkan semua tindakan untuk semua pengguna sementara chmod 666akan memungkinkan semua pengguna untuk membaca dan menulis tetapi tidak dapat menjalankan file.

USMAN FAZIL
sumber
Ini yang saya butuhkan, terima kasih!
crazynx
9

Cukup menambahkan dockersebagai grup tambahan untuk jenkinspengguna

sudo usermod -a -G docker jenkins

tidak selalu cukup ketika menggunakan gambar Docker sebagai Agen Jenkins . Yaitu, jika Anda Jenkinsfilememulai dengan pipeline{agent{dockerfileatau pipeline{agent{image:

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

Ini karena Jenkins melakukan docker runperintah, yang menghasilkan tiga masalah.

  • Agen akan (mungkin) tidak menginstal program Docker.
  • Agen tidak akan memiliki akses ke soket daemon Docker, dan karenanya akan mencoba menjalankan Docker-in-Docker, yang tidak disarankan .
  • Jenkins memberikan ID pengguna numerik dan ID grup numerik yang harus digunakan Agen. Agen tidak akan memiliki grup tambahan, karena docker runtidak melakukan login ke wadah (lebih seperti a sudo).

Menginstal Docker untuk Agen

Membuat program Docker tersedia dalam gambar Docker hanya perlu menjalankan langkah-langkah instalasi Docker di Dockerfile Anda:

# 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

...

Berbagi soket daemon Docker

Seperti yang telah dikatakan sebelumnya , memperbaiki masalah kedua berarti menjalankan wadah Jenkins Docker sehingga berbagi soket daemon Docker dengan daemon Docker yang berada di luar wadah. Jadi, Anda perlu memberi tahu Jenkins untuk menjalankan wadah Docker dengan berbagi itu, dengan demikian:

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

Pengaturan UID dan GID

Perbaikan ideal untuk masalah ketiga adalah membentuk kelompok tambahan untuk Agen. Tampaknya itu tidak mungkin. Satu-satunya perbaikan yang saya ketahui adalah menjalankan Agen dengan Jenkins UID dan Docker GID (soket memiliki izin menulis kelompok dan dimiliki oleh root.docker). Tetapi secara umum, Anda tidak tahu apa itu ID (mereka dialokasikan ketika useradd ... jenkinsdan groupadd ... dockerberjalan ketika Jenkins dan Docker diinstal pada host). Dan Anda tidak bisa sekadar memberi tahu Jenkins kepada pengguna jenkinsdan grup penggunadocker

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

karena itu memberitahu Docker untuk menggunakan pengguna dan grup yang dinamai jenkinsdan docker di dalam gambar , dan gambar Docker Anda mungkin tidak memiliki jenkinspengguna dan grup, dan bahkan jika itu terjadi tidak akan ada jaminan ia akan memiliki UID dan GID yang sama dengan tuan rumah, dan sama tidak ada jaminan bahwa dockerGID adalah sama

Untungnya, Jenkins menjalankan docker buildperintah untuk Dockerfile Anda dalam sebuah skrip, sehingga Anda dapat melakukan beberapa keajaiban skrip shell untuk melewati informasi itu ketika Docker membuat argumen:

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

Itu menggunakan idperintah untuk mendapatkan UID dan GID dari jenkinspengguna dan statperintah untuk mendapatkan informasi tentang soket Docker.

Dockerfile Anda dapat menggunakan informasi itu untuk mengatur jenkinspengguna dan dockergrup untuk Agen, menggunakan groupadd, groupmoddan 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
Raedwald
sumber
Ini adalah solusi komprehensif yang sangat baik dan satu-satunya yang bekerja untuk saya ketika menggunakan socket buruh pelabuhan yang dibagikan kepada buruh pelabuhan melalui dockerfile. Seharusnya posting blog sendiri. Terima kasih untuk ini!
Greg Olmstead
Sepertinya Anda bisa lulus -u jenkins:$(getent group docker | cut -d: -f3)?
Gillespie
Ketika melewati argumen, mungkin lebih baik untuk mengubah baris berikut: args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'dengan args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:jenkins --group-add docker' Ketika melewati -u jenkins: docker, Anda mengubah grup pengguna utama, yang berarti ketika pengguna menulis file, katakanlah di ruang kerja, itu akan mengatur file pengguna untuk jenkins dan grup ke buruh pelabuhan. Yang mungkin bukan itu yang kita inginkan.
Nicolas Forney
8

Saya memiliki Jenkins yang berjalan di Docker dan terhubung Jenkins menggunakan soket Docker dari mesin host Ubuntu 16.04 melalui volume ke /var/run/docker.sock.

Bagi saya solusinya adalah:

1) Di dalam wadah Docker dari Jenkins ( docker exec -it jenkins bashpada mesin host)

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

2) Pada mesin host:

sudo service docker restart

664 berarti - baca dan tulis (tetapi tidak dijalankan) untuk pemilik dan pengguna dari grup.

heroin
sumber
Ini adalah satu-satunya solusi yang tidak memerlukan login / login, yaitu solusi yang berfungsi ketika mencoba menjalankan ini dalam skrip shell.
PV
3

Saat melakukan konfigurasi produksi saya mendapat masalah izin. Saya mencoba solusi di bawah ini untuk menyelesaikan masalah.

Pesan eror

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

Solusi: izin soket yang ditunjukkan dalam pesan kesalahan, /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

Setelah perubahan izin untuk docket.sock kemudian jalankan perintah di bawah ini untuk memeriksa izin.

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/
Srikant Patra
sumber
2

Dalam kasus saya, itu tidak hanya perlu menambahkan jenkinspengguna ke dockergrup, tetapi menjadikan grup itu grup utama jenkinspengguna.

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

Jangan lupa untuk menghubungkan kembali node jenkins slave atau me-restart server jenkins, tergantung pada kasus Anda.

Camilo Silva
sumber
2

2019-02-16

Sebagian besar langkah saya sama dengan yang telah ditulis orang lain. Namun, saya tidak dapat menambahkan jenkins ke buruh pelabuhan grup menggunakan usermod dengan solusi yang disebutkan.

Saya mencoba perintah berikut dari host buruh pelabuhan , dan dari wadah buruh pelabuhan yang sedang beroperasi :

sudo usermod -a -G docker jenkins

(Saya masuk ke wadah buruh pelabuhan berjalan dengan perintah berikut dari tuan buruh pelabuhan :

docker exec -t -i my_container_id_or_name /bin/bash

)

Diterima dari buruh pelabuhan :

usermod: pengguna 'jenkins' tidak ada

Diterima dari buruh pelabuhan :

Kami percaya Anda telah menerima kuliah biasa dari Administrator Sistem setempat. Biasanya bermuara pada tiga hal ini:

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

[sudo] kata sandi untuk jenkins:

Saya tidak tahu kata sandinya.

Tanpa sudobagian dari perintah, dalam wadah buruh pelabuhan saya menerima:

usermod: Izin ditolak. usermod: tidak bisa mengunci / etc / passwd; coba lagi nanti.

Solusi: Saya masuk ke wadah buruh pelabuhan yang berjalan dari host buruh pelabuhan dengan perintah berikut:

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

Sekarang, saya masuk sebagai root , dan mengeluarkan perintah berikut:

usermod -a -G docker jenkins

Kemudian, dari host buruh pelabuhan , saya memulai kembali wadah buruh pelabuhan saya yang sedang berjalan dengan perintah berikut:

docker restart my_container_id_or_name

Setelah itu, saya memulai pekerjaan jenkins dan selesai dengan sukses.

Saya hanya menggunakan pengguna root untuk mengeluarkan usermodperintah untuk pengguna jenkins.

Z3d4s
sumber
2

2019-05-26

Ini berhasil untuk saya!

Contoh susunan buruh pelabuhan:

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"
pham cuong
sumber
2

Saya menghadapi masalah serupa, yang merupakan masalah perizinan dan penyebab masalah ini adalah karena daemon Docker / server selalu berjalan sebagai rootpengguna, dan ingin Anda untuk selalu mengawali perintah docker dengannya sudo.

Daemon Docker mengikat ke soket Unix bukan port TCP. Secara default soket Unix dimiliki oleh pengguna rootdan pengguna lain hanya dapat mengaksesnya menggunakan sudo.

Untuk memperbaikinya, inilah yang bekerja untuk saya:

Pertama, periksa apakah Anda memiliki grup buruh pelabuhan yang sudah dibuat:

cat /etc/group

Jika Anda tidak menemukan dockerdalam daftar yang ditampilkan, maka Anda harus membuatnya:

sudo groupadd docker

Selanjutnya, konfirmasikan Anda userdan Anda groupmenggunakan perintah di bawah ini:

cat /etc/group

Gulir ke seluruh untuk melihat grup untuk buruh pelabuhan. Seharusnya dari format ini

docker:x:140:promisepreston

dimana dockeraku groupdan promiseprestonakuuser

Sekarang kami dapat menambahkan pengguna Anda ke grup buruh pelabuhan

Hanya untuk File Kontainer Docker:

Salin dan jalankan perintah di bawah ini di terminal Anda persis seperti yang dinyatakan tanpa memodifikasinya, terlepas dari gambar docker / wadah / perintah yang ingin Anda jalankan atau sedang coba jalankan atau sedang melemahkan masalah izin:

sudo usermod -aG docker $USER

Setelah menjalankan perintah di atas, Anda harus keluar dan masuk kembali sehingga keanggotaan grup Anda dievaluasi kembali. Namun, di Linux, Anda juga dapat menjalankan perintah berikut di bawah ini untuk mengaktifkan perubahan pada grup ( Salin dan jalankan perintah di bawah ini di terminal Anda persis bagaimana hal itu dinyatakan tanpa mengubahnya dengan cara apa pun, terlepas dari gambar docker / wadah / perintah yang Anda ingin menjalankan atau mencoba menjalankan atau sedang mengesampingkan masalah izin ):

newgrp docker 

Anda sekarang dapat memverifikasi bahwa Anda dapat menjalankan perintah buruh pelabuhan tanpa izin sudo, dengan menjalankan perintah yang menyebabkan masalah izin lagi, katakan ( Ganti my-commanddengan nama gambar / wadah / perintah Anda ):

docker run my-command

Untuk file sistem file Docker dan Lokal:

Jika Anda memiliki salinan file di sistem file lokal Anda, maka Anda dapat mengubah kepemilikan direktori aplikasi tempat file aplikasi disimpan, menggunakan format ini:

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

Jadi dalam kasus saya adalah:

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

Catatan: Silakan jalankan perintah ini di dalam direktori induk yang menampung direktori aplikasi.

Itu saja.

saya harap ini membantu

Janji Preston
sumber
1
sudo usermod -a -G docker jenkins
sudo service jenkins restart
Frank Hou
sumber
1

Saya menjalankan Jenkins di dalam wadah buruh pelabuhan. Solusi paling sederhana bagi saya adalah membuat gambar khusus yang secara dinamis mengatur GID, seperti:

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

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

Atau Anda dapat meluncurkan jenkins dengan opsi berikut:

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

Ini mengasumsikan gambar jenkins Anda memiliki klien docker diinstal. Lihat: https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci

Gillespie
sumber
1

Jika Anda mendapatkan kesalahan seperti di bawah ini,

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

atau

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"

Coba saja jalankan perintah berikut,

$ sudo su - jenkins
$ sudo usermod -a -G docker $USER
$ sudo chown jenkins:docker /var/run/docker.sock
lakshmikandan
sumber
`sudo usermod -a-G docker $ USER 'akan meminta kata sandi jenkins, tidak yakin apa kata sandi pengguna.
3lokh
Saya pikir Anda harus memberikan izin sudo untuk pengguna Jenkins. atau Anda dapat mencoba dengan perintah berikut di root user, usermod -a -G docker jenkinsdanchown jenkins:docker /var/run/docker.sock
lakshmikandan
Anda tidak boleh mengubah kepemilikan soket menjadi jenkins. Dan Anda harus menjalankan sudo karena pengguna normal apa pun memiliki akses sudo, bukan sebagai jenkins. Apa yang ditambahkan jawaban ini ke jawaban yang diterima?
Jim Stewart
1

Saya menggunakan gambar docker jenkins resmi ( https://hub.docker.com/r/jenkins/jenkins ) tapi saya pikir solusi ini berlaku untuk sebagian besar kasus penggunaan di mana kami ingin menjalankan Docker di dalam wadah Docker.

Cara yang disarankan untuk menggunakan Docker di dalam wadah Docker, adalah dengan menggunakan deamon Docker dari sistem host. Artikel bagus mengenai hal itu: https://itnext.io/docker-in-docker-521958d34efd .

Rahasia untuk menangani masalah izin, tentang pertanyaan ini, adalah menambahkan izin untuk pengguna wadah di dalam wadah, bukan sistem host . Hanya pengguna root yang memiliki izin untuk melakukannya secara default, jadi

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

akan melakukannya. Ingatlah untuk memulai kembali wadah.

Saya kira cara paling sederhana untuk mencapai ini adalah dengan membuat Dockerfile yang disesuaikan:

# 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
albin
sumber
Tidak perlu menginstal seluruh buruh pelabuhan pada gambar Jenkins, lihat jawaban saya
deFreitas
1

Jika seseorang masih menghadapi masalah pada mesin lokal mereka (Ubuntu) maka coba perintah di bawah ini:

sudo chmod 666 /var/run/docker.sock
Keshari Nandan
sumber
1

Dalam kasus saya ini akan berhasil. navigasi repo lokal Anda dan masukkan perintah ini.

sudo chmod 666 /var/run/docker.sock
ruwanmadushanka
sumber
0

Di server tempat Jenkins berjalan, saya menggunakan

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

Dan kemudian jalankan setiap wadah buruh pelabuhan dengan

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

Menggunakan setfacl tampaknya merupakan pilihan yang lebih baik, dan tidak ada "-u user" yang dibutuhkan. Kontainer kemudian dijalankan sebagai pengguna yang sama yang menjalankan Jenkins. Tapi saya akan sangat menghargai umpan balik dari para pakar keamanan.

java4africa
sumber
0

gunakan di bawah 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
Eslamspot
sumber
0

dalam kasus saya itu baru memulai layanan buruh pelabuhan:

sudo service docker start
Badr Bellaj
sumber
0

sering kali perlu reboot untuk memengaruhi kelompok pengguna dan pengguna baru.

Fahad
sumber
0

Jika Anda menjalankan Jenkins di dalam wadah buruh pelabuhan dan Jenkins Anda terhubung ke buruh pelabuhan tuan rumah maka Anda dapat memperbaikinya hanya dengan Dockerfile di bawah ini:

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

Mungkin Anda harus menjalankan buruh pelabuhan dengan opsi "-u root" dari awal

Setidaknya itu menyelesaikan masalah saya

Anders K.
sumber
1
Maka Anda mungkin mendapatkan file yang dibuat sebagai pengguna root. Setidaknya inilah yang terjadi pada saya, dengan Docker 18.06.1.
Ernst de Haan