Docker: unix'deki Docker arka plan programı prizine bağlanmaya çalışırken izniniz reddedildi: ///var/run/docker.sock


177

Liman işçisi için yeniyim. Jenkins'le yerel makinemde (Ubuntu 16.04) liman işçisi kullanmaya çalıştım.

Aşağıdaki boru hattı komut dosyası ile yeni bir iş yapılandırdım.

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

Ancak aşağıdaki hata ile başarısız olur.

resim açıklamasını buraya girin


1
monolitik bir Jenkins mi yoksa efendi-köle düzeni mi var? Docker inspect komutunu hangi kullanıcıyla yürüttüğünüzü kontrol edin. /Var/run/docker.sock dosyasının gruba RW erişimi olup olmadığına bakın.
Ram Kamath


2
yükleme sonrası yükleme adımları: docs.docker.com/install/linux/linux-postinstall/…
radistao

Yanıtlar:


297

Kullanıcının jenkinsgruba eklenmesi gerekir docker:

sudo usermod -a -G docker jenkins

Ardından Jenkins'i yeniden başlatın.

Düzenle

Bu iletiyi docker'dan aldığınız için yığın taşması sorusuna gelirseniz, ancak jenkins kullanmıyorsanız, büyük olasılıkla hata aynıdır: ayrıcalıksız kullanıcınız docker grubuna ait değildir.

Yapabilirsin:

sudo usermod -a -G docker alice

veya kullanıcı adınız ne olursa olsun.

Sonunda bunu kontrol edebilir grep docker /etc/groupve böyle bir şey görebilirsiniz:

docker:x:998:alice

satırlardan birinde.

Ardından kullanıcı grubu kimliğinizi şu şekilde değiştirin docker:

newgrp docker

90
ve yeniden kullanıcı
Ilya Kolesnikov

8
Güzel cevap, ancak daha genel olmak için bunu yapabiliriz: sudo usermod -a -G docker $USERve çıkış yapın veya yeniden başlatın. bağlantı
Julien Nyambal

10
Bunun çalışması için sunucumu yeniden başlatmam gerekiyordu.
etagwerker

3
Bunun çalışması için düğümlerimin bağlantısını kesmek / yeniden bağlamak zorunda kaldım (ssh üzerinden
bağlılar

29
Tekrar giriş yapmanıza gerek yok, sadece newgrp dockeraynı terminal oturumunda kullanın.
C14L

68

İlk çözümlerim:

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

Ama hiçbiri benim için çalışmıyor, denedim:

chmod 777 /var/run/docker.sock

Bu işe yarıyor, ama doğru çağrı olup olmadığını bilmiyorum.


4
Muhtemelen başarısız olmasının nedeni, terminali yeniden açmanız gerektiğidir. 664 yaptıktan sonra başarısız oldu, ama sonra çalıştığı yeni bir kabuk açtım.
PHGamer

1
Yeniden açmayı denedim, ancak sadece son chmod 777'den sonra çalışmaya başladı
ironik

sorun, yeniden başlatmadan sonra 777'nin 660'a sıfırlanmasıydı. Benim için sorunu düzelten şey 'usermod -aG kullanıcıları jenkins' idi.
ironik

Sıfırlandığını anlıyorum, ancak docker.sock izinlerini 777 olarak ayarlamıyorum. Bu, sisteminize kimsenin kök vermesini sağlar. Liman işçileri ile konuşabilir ve kısıtlama olmaksızın ayrıcalıklı kapsayıcılar oluşturabilirler.
Lance Hudson

3
Bu yazar için çalıştı ve benim için bile, docker.sockdosyaya daha fazla erişim vermek en iyi çözüm değil, sadece usermod... talimatlarını yürütmeniz ve sonra sisteminizi yeniden başlatmanız gerekir, aksi takdirde etkili olmaz
Mariano Ruiz

32

Benim için başarı

sudo usermod -a -G docker $USER
reboot

5
yeniden başlatmaya gerek yok. Sadece çıkış yapın ve tekrar giriş yapın. Usermod hakkında konuşuyorum
Abdennour TOUMI

1
Ubuntu 18.04'te, ayarın çalışması için yeniden başlatmam gerekiyordu.
Nikhil

1
Ubuntu 20.04'te yeniden başlatmaya ihtiyacım vardı. Oturumu kapat yeterli değil.
framontb

Veya oturumu kapatmak yerine su $ {USER} 'ı çalıştırın
goonerify

19

2018/08/19

Bu konuda günlerce takılıp kaldım ve neden ve nasıl olduğu konusunda tam bir cevap bulamadığım için, aynı sorunla karşılaşan diğer insanlar için bir tane yayınlayacağım ve yukarıdan cevaplar işe yaramıyor.

Jenkins docker'ın içinde çalıştırırken önemli 3 adım:

  1. Bağlantı /var/run/docker.sockistasyonunu ana bilgisayardan kullanabilmek için soketi jenkins kabına monte edersiniz .
  2. Kullanabilmek için docker'ı konteynerin içine yerleştirmeniz gerekir. Bu , bunun nasıl yapılacağı hakkında harika ve basit bir makaledir. Daha yeni sürümlerde zaten docker yüklü olabilir
  3. sudo usermod -a -G docker jenkinsDocker grubuna cenkins eklemek için koşuyorsunuz . Bununla birlikte, burada ana makine docker ve konteyner docker aynı grup kimliğine sahip değilse bir izin sorunu yaşayabilirsiniz, bu nedenle konteyner docker'ın giderini ana makine docker gid ile aynı olacak şekilde ayarlamak çok önemlidir.

Bir fırlatma senaryonun bir parçası olarak ya da basitçe kullanarak bunu yapabilirsiniz execve elle yapıyor: groupmod -g <YOUR_HOST_DOCKER_GID> docker.

Ayrıca, izinleri değişmez ait /var/run/docker.sockolduğunu, temelde veriyoruz büyük bir güvenlik riski olduğu için böyle 777 veya şeyler herkesin makinenizde kullanım docker izni

Bu yardımcı olur umarım


1
Teşekkürler-- mevcut Jenkins Docker görüntüleri için docker komutlarının zaten kurulu olduğunu (ve apt-get'in kurulu olmadığını unutmayın) spot on.
Steve Bağlar

1
Grup kimliği sorunuyla hayatımı kurtardım. Teşekkürler!
lenkovi

13

Jenkins kullanıcısını kök gruba ekledim ve jenkinleri yeniden başlattım ve çalışmaya başladı.

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

16
Bu kötü bir güvenlik uygulaması. Tercih edilen yaklaşım bu cevaptır .
kevindaub

11

Docker.sock dosyasının erişim iznini değiştirme

chmod 777 /var/run/docker.sock

veya u sudokomutun başlangıcında kullanabilirsiniz .

chmod 777tüm kullanıcılar için tüm işlemlere izin verirken chmod 666, tüm kullanıcıların okuma ve yazmalarına izin verir ancak dosyayı yürütemez.


İhtiyacım olan bu, teşekkürler!
crazynx

9

Sadece kullanıcı için ek bir grupdocker olarak eklemejenkins

sudo usermod -a -G docker jenkins

Jenkins Aracısı olarak bir Docker görüntüsü kullanırken her zaman yeterli değildir . Yani, veya Jenkinsfileile başlarsanız :pipeline{agent{dockerfilepipeline{agent{image

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

Bunun nedeni Jenkins'in docker runüç soruna yol açan bir komut gerçekleştirmesidir .

  • Aracıda (muhtemelen) Docker programları yüklü olmaz.
  • Aracı, Docker arka plan programı yuvasına erişemeyecektir ve bu nedenle, önerilmeyen Docker-in-Docker'ı çalıştırmayı deneyecektir .
  • Jenkins, Agent'ın kullanması gereken sayısal kullanıcı kimliğini ve sayısal grup kimliğini verir. Temsilcinin herhangi bir ek grubu docker runolmayacaktır , çünkü konteynere giriş yapmaz (daha çok a'ya benzer sudo).

Aracı için Docker'ı Yükleme

Docker programlarını Docker görüntüsünde kullanılabilir hale getirmek için Dockerfile dosyanızdaki Docker kurulum adımlarının çalıştırılması yeterlidir:

# 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

...

Docker arka plan programı yuvasını paylaşma

Daha önce de belirtildiği gibi , ikinci sorunun düzeltilmesi Jenkins Docker kapsayıcısını çalıştırmak anlamına gelir, böylece Docker arka plan programı soketini konteynerin dışındaki Docker arka plan programı ile paylaşır . Bu nedenle Jenkins'e Docker kapsayıcısını bu paylaşımla çalıştırmasını söylemeniz gerekir, böylece:

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

UID'leri ve GID'leri ayarlama

Üçüncü sorun için ideal çözüm, Temsilci için ek gruplar oluşturmak olacaktır. Bu mümkün görünmüyor. Fark ettiğim tek düzeltme Agent'ı Jenkins UID ve Docker GID ile çalıştırmak (soketin grup yazma izni var ve ait olduğu root.docker). Ancak genel olarak, bu kimliklerin ne olduğunu bilmiyorsunuz ( Jenkins ve Docker ana bilgisayara yüklendiğinde useradd ... jenkinsve groupadd ... dockerçalıştırıldıklarında ayrıldılar ). Ve Jenkins'e kullanıcı kullanıcı jenkinsve grubuna söyleyemezsiniz.docker

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

çünkü bu , Docker'a adlandırılmış jenkinsve docker görüntü içindeki kullanıcı ve grubu kullanmasını söyler ve Docker görüntünüzde muhtemelen jenkinskullanıcı ve grup yoktur ve bunu yapsa bile aynı UID ve GID'ye sahip olacağını garanti etmez ve benzer şekilde dockerGID'in aynı olduğuna dair bir garanti yoktur.

Neyse ki Jenkins docker buildDockerfile komutunuzu bir komut dosyasında çalıştırır, böylece Docker oluşturma argümanları olarak bu bilgileri iletmek için bazı kabuk komut dosyası sihirleri yapabilirsiniz:

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

Yani kullanır idalmak için komut UID ve GID ait jenkinskullanıcı ve statDocker soket hakkında bilgi almak için komutu.

Kişisel Dockerfile kurulum a bu bilgileri kullanabilir jenkinskullanıcı ve dockerkullanma, Agent için grubun groupadd, groupmodve 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

Bu, mükemmel bir kapsamlı çözümdür ve dockerfile aracılığıyla docker ile paylaşılan docker soketini kullanırken benim için çalışan tek çözümdür. Kendi blog yazısı olmalı. Bunun için teşekkürler!
Greg Olmstead

Geçebileceğin anlaşılıyor -u jenkins:$(getent group docker | cut -d: -f3)mu?
Gillespie

: Args geçirmeden zaman, aşağıdaki satırı değiştirmek için daha iyi olacaktır args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'tarafından args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:jenkins --group-add docker' -u Jenkins'i geçerken: Kullanıcı yazma dosya, çalışma alanında söz sahibi izin verdiğinde liman işçisi, Şunu birincil kullanıcı grubunu değiştirmek, bu dosyayı ayarlayacaktır kullanıcı cenkins ve grup liman işçisi. Muhtemelen niyetimiz bu değil.
Nicolas Forney

8

Jenkins Docker'da çalışıyor ve Jenkins, /var/run/docker.sock birimine hacim yoluyla Ubuntu 16.04 ana bilgisayarından Docker soketini kullanıyor.

Benim için çözüm:

1) Jenkins Docker konteynerinin içi ( docker exec -it jenkins bashana makinede)

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

2) Ana makinede:

sudo service docker restart

664 anlamına gelir - grubun sahibi ve kullanıcıları için okuma ve yazma (yürütme değil).


Bu, bir oturum açma / oturum açma gerektirmeyen tek çözümdür, yani bunu bir kabuk komut dosyasında çalıştırmaya çalışırken çözümdür.
PV

3

Üretim yapılandırma yaparken ben izin sorunu var. Ben sorunu çözmek için aşağıda çözüm çalıştı.

Hata mesajı

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

Çözüm: /var/run/docker.sock hata iletisinde belirtilen soketin izinleri:

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

Docket.sock için izin değiştirdikten sonra izinleri kontrol etmek için aşağıdaki komutu yürütün.

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/

2

Benim durumumda, sadece gruba jenkinskullanıcı eklemek dockerdeğil, o grubu jenkinskullanıcının birincil grubu yapmak da gerekliydi .

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

Durumunuza bağlı olarak, jenkins slave düğümünü yeniden bağlamayı veya jenkins sunucusunu yeniden başlatmayı unutmayın.


2

2019/02/16

Adımların çoğu benim için diğerleri ile aynı idi. Ancak, bahsi geçen çözümlerle usermod kullanarak grup liman işçisine jenkin ekleyemedim.

Docker ana bilgisayarından ve çalışan docker kapsayıcısından aşağıdaki komutu denedim :

sudo usermod -a -G docker jenkins

( Çalışan docker kapsayıcısına docker ana bilgisayarından aşağıdaki komutla girdim :

docker exec -t -i my_container_id_or_name /bin/bash

)

Docker ana bilgisayarından alındı :

usermod: 'jenkins' kullanıcısı mevcut değil

Liman işçisi konteynerinden alındı :

Yerel Sistem Yöneticisinden olağan dersi aldığınıza inanıyoruz. Genellikle bu üç şeye bağlanır:

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

[sudo] cenkins şifresi:

Şifreyi bilmiyordum.

sudoKomutun bir parçası olmadan, docker kapsayıcısında şunları aldım:

usermod: İzin reddedildi. usermod: kilitleyemiyor / etc / passwd; daha sonra tekrar deneyin.

Çözüm: Ben girilen çalışan liman işçisi konteyner gelen liman işçisi konak şu komutla:

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

Şimdi root olarak girdim ve şu komutu verdim :

usermod -a -G docker jenkins

Sonra, docker ana bilgisayarından , çalışan docker kapsayıcımı aşağıdaki komutla yeniden başlattım :

docker restart my_container_id_or_name

Bundan sonra, jenkins işine başladım ve başarıyla bitti.

Kök kullanıcıyı yalnızca kullanıcıya usermodkomut vermek için kullandım jenkins.


2

2019/05/26

Bu benim için çalıştı!

Docker-compose örneği:

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"

2

Benzer bir sorunla karşılaştım, bu bir izin sorunudur ve bu sorunun nedeni Docker arka plan programı / sunucusu her zaman rootkullanıcı olarak çalışır ve her zaman docker komutunu önceden yazmanızı ister sudo.

Docker arka plan programı TCP bağlantı noktası yerine Unix soketine bağlanır. Varsayılan olarak Unix soketinin sahibi kullanıcıdır rootve diğer kullanıcılar sokete yalnızca kullanarak erişebilirler sudo.

Bunu düzeltmek için benim için işe yarayan:

Öncelikle, önceden oluşturulmuş bir docker grubunuz olup olmadığını kontrol edin:

cat /etc/group

Görüntülenen dockerlistede bulamazsanız , bir tane oluşturmanız gerekir:

sudo groupadd docker

Ardından, aşağıdaki komutu kullanarak kendiniz userve öğenizi onaylayın group:

cat /etc/group

Docker grubunu görmek için kaydırın. Bu formatta olmalı

docker:x:140:promisepreston

dockerbenim groupve nerede promiseprestonbenimuser

Artık kullanıcınızı docker grubuna ekleyebiliriz

Yalnızca Docker Container Dosyaları için:

Çalıştırmak istediğiniz veya çalıştırmaya çalıştığınız veya izin sorununu yayınlayan docker görüntüsü / kapsayıcı / komutuna bakılmaksızın, aşağıdaki komutu terminalinizde tam olarak nasıl belirtildiğini kopyalayıp çalıştırın:

sudo usermod -aG docker $USER

Yukarıdaki komutu çalıştırdıktan sonra, grup üyeliğinizin yeniden değerlendirilmesi için Oturumu kapatıp tekrar oturum açmanız gerekir. Bununla birlikte, Linux'ta, gruplardaki değişiklikleri etkinleştirmek için aşağıdaki komutu da çalıştırabilirsiniz ( Docker görüntüsü / kapsayıcısı / komutundan bağımsız olarak, terminalinizdeki aşağıdaki komutu tam olarak nasıl belirtildiğini kopyalayın ve çalıştırın. çalıştırmak istiyor veya çalıştırmaya çalışıyorsanız veya izin sorununu yayınlıyorsa ):

newgrp docker 

Artık izin sorununa neden olan komutu tekrar çalıştırarak docker komutlarını sudo izinleri olmadan çalıştırabildiğinizi doğrulayabilirsiniz, örneğin ( Resminizin / konteynerinizin / komutunuzun adıyla değiştirinmy-command ):

docker run my-command

Docker ve Yerel dosya sistemi dosyaları için:

Yerel dosya sisteminizdeki dosyaların bir kopyasına sahipseniz, bu biçimi kullanarak uygulama dosyalarının depolandığı uygulama dizininin sahipliğini değiştirebilirsiniz:

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

Yani benim durumumda:

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

Not: Lütfen bu komutu uygulama dizinini barındıran üst dizinin içinde çalıştırın.

Bu kadar.

Umarım bu yardımcı olur


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

1

Jenkins docker konteynerinin içinde koşuyorum. Benim için en basit çözüm, GID'yi dinamik olarak ayarlayan özel bir görüntü oluşturmaktı:

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

Bkz. Https://github.com/jenkinsci/docker/issues/263

Alternatif olarak, aşağıdaki seçeneklerle cenkins'i başlatabilirsiniz:

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

Bu, jenkins görüntünüzde docker istemcisinin yüklü olduğunu varsayar. Bkz. Https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci


1

Aşağıdaki gibi hatalar alırsanız,

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

veya

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"

Sadece aşağıdaki komutları çalıştırmayı deneyin,

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

`sudo usermod -a -G docker $ USER 'kullanıcı şifresinin ne olduğundan emin değil, jenkinlerin şifresini soracaktır.
3lokh

Sanırım Jenkins kullanıcısı için sudo izni vermelisiniz. veya root kullanıcısında aşağıdaki komutu deneyebilirsiniz usermod -a -G docker jenkinsvechown jenkins:docker /var/run/docker.sock
lakshmikandan

Soketin sahipliğini jenkins olarak değiştirmemelisiniz. Ve sudo'yu cenkins olarak değil, normal kullanıcının sudo erişimi olan herhangi bir şey olarak çalıştırmalısınız. Bu cevap kabul edilen cevaba ne katar?
Jim Stewart

1

Resmi jenkins docker görüntüsünü ( https://hub.docker.com/r/jenkins/jenkins ) kullanıyorum, ancak bu çözümün Docker'ı bir Docker konteyneri içinde çalıştırmak istediğimiz çoğu kullanım durumu için geçerli olduğunu düşünüyorum.

Docker'ı bir Docker kapsayıcısının içinde kullanmanın önerilen yolu, ana bilgisayar sisteminin Docker deamon'unu kullanmaktır. Bununla ilgili güzel bir makale: https://itnext.io/docker-in-docker-521958d34efd .

Bu sorunun ilgili olduğu izin sorununu ele almanın sırrı, kapsayıcı içindeki kullanıcı için ana sistem değil, izinler eklemektir . Yalnızca kök kullanıcının bunu varsayılan olarak yapma izni vardır, bu nedenle

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

yapacağım. Kapsayıcıyı yeniden başlatmayı unutmayın.

Sanırım bu başarmak için en kolay yolu özelleştirilmiş bir Dockerfile oluşturmaktır:

# 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

Jenkins imajına
docker'ın

1

Birisi hala yerel makinesinde (Ubuntu) sorunla karşı karşıyaysa, aşağıdaki komutu deneyin:

sudo chmod 666 /var/run/docker.sock

1

Benim durumumda bu başarılı bir şekilde çalışacaktır. yerel deponuzda gezinin ve bu komutu girin.

sudo chmod 666 /var/run/docker.sock

0

Jenkins'in çalıştığı sunucuda,

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

Ve sonra her docker konteynerini

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

Setfacl kullanmak daha iyi bir seçenek gibi görünüyor ve "-u kullanıcısı" gerekmiyor. Kaplar daha sonra Jenkins çalıştıran kullanıcıyla aynı şekilde çalışır. Ancak güvenlik uzmanlarının geri bildirimlerini takdir ediyorum.


0

dockerfile altında kullanın

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

0

benim durumumda sadece docker hizmetine başlıyordu:

sudo service docker start

0

genellikle yeni kullanıcı grubu ve kullanıcı üzerinde etkili olması için yeniden başlatılması gerekir.


0

Jenkins'i bir liman işçisi konteyneri içinde çalıştırıyorsanız ve Jenkins'iniz ana makine limanına bağlanıyorsa, bunu aşağıdaki Dockerfile ile düzeltebilirsiniz:

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

-6

Belki docker'ı en baştan "-u root" seçeneği ile çalıştırmalısınız

En azından bu sorunumu çözdü


1
Sonra kullanıcı olarak oluşturulan dosyaları alabilirsiniz root. En azından Docker 18.06.1 ile başıma gelen buydu.
Ernst de Haan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.