Jestem nowy w dockerze. Właśnie próbowałem użyć Dockera na moim lokalnym komputerze (Ubuntu 16.04) z Jenkinsem.
Skonfigurowałem nowe zadanie z poniższym skryptem potoku.
node {
stage('Build') {
docker.image('maven:3.3.3').inside {
sh 'mvn --version'
}
}
}
Ale kończy się niepowodzeniem z poniższym błędem.
docker
jenkins
jenkins-pipeline
Ponsuyambu Velladurai
źródło
źródło
Odpowiedzi:
Użytkownik
jenkins
musi zostać dodany do grupydocker
:Następnie uruchom ponownie Jenkins.
Edytować
Jeśli dojdziesz do pytania o przepełnienie stosu, ponieważ otrzymujesz tę wiadomość od dockera, ale nie używasz jenkins, najprawdopodobniej błąd jest ten sam: twój nieuprzywilejowany użytkownik nie należy do grupy docker.
Możesz to zrobić:
lub jakakolwiek jest twoja nazwa użytkownika.
Możesz to sprawdzić na końcu robiąc
grep docker /etc/group
i zobaczyć coś takiego:w jednej z linii.
Następnie zmień identyfikator grupy użytkowników na
docker
:źródło
sudo usermod -a -G docker $USER
i wyloguj się lub uruchom ponownie. linknewgrp docker
w tej samej sesji terminala.Moje pierwsze rozwiązania to:
Ale żaden z nich nie działa dla mnie, próbowałem:
To działa, ale nie wiem, czy to właściwe połączenie.
źródło
docker.sock
pliku nie jest najlepszym rozwiązaniem, wystarczy wykonaćusermod
... instrukcje, a następnie zrestartować system, inaczej to nie zadziałaSukces dla mnie
źródło
2018-08-19
Utknąłem na tym od wielu dni i ponieważ nie znalazłem pełnej odpowiedzi z wyjaśnieniem, dlaczego i jak, opublikuję jedną dla innych osób, które natkną się na ten sam problem, a odpowiedzi z góry nie działają.
Oto 3 kluczowe kroki podczas uruchamiania Jenkinsa w dockerze:
/var/run/docker.sock
Montujesz gniazdo do kontenera Jenkinsa, aby móc korzystać z dockera z hosta.sudo usermod -a -G docker jenkins
, aby dodać Jenkins do grupy Döcker. Jednak w tym miejscu możesz napotkać problem z uprawnieniami, jeśli okno dokowane hosta i okno dokowane kontenera nie mają tego samego identyfikatora grupy, więc bardzo ważne jest, aby dostosować gid kontenera, aby był taki sam jak gid dokera hostaMożna to zrobić jako część skryptu uruchamiania lub po prostu za pomocą
exec
i robi to ręcznie:groupmod -g <YOUR_HOST_DOCKER_GID> docker
.Ponadto, nie należy zmieniać uprawnienia Spośród
/var/run/docker.sock
777 lub takich rzeczach, bo to jest poważne zagrożenie bezpieczeństwa, to w zasadzie dając każdemu pozwolenie na używanie dokowanym na komputerzeMam nadzieję że to pomoże
źródło
Dodałem użytkownika jenkins do grupy root i zrestartowałem jenkins i zaczęło działać.
źródło
Zmień uprawnienia dostępu do pliku docker.sock
lub możesz użyć
sudo
na początku polecenia.chmod 777
zezwoli na wszystkie akcje wszystkim użytkownikom, a wszystkim użytkownikomchmod 666
pozwoli na odczyt i zapis, ale nie będzie mógł wykonać pliku.źródło
Po prostu dodaj
docker
jako dodatkową grupę dlajenkins
użytkownikanie zawsze wystarcza, gdy używasz obrazu Dockera jako agenta Jenkinsa . To znaczy, jeśli
Jenkinsfile
zaczynasz odpipeline{agent{dockerfile
lubpipeline{agent{image
:Dzieje się tak, ponieważ Jenkins wykonuje
docker run
polecenie, co powoduje trzy problemy.docker run
nie będzie logował się do kontenera (to bardziej jak asudo
).Instalowanie Dockera dla agenta
Udostępnienie programów platformy Docker w obrazie platformy Docker wymaga po prostu wykonania kroków instalacji platformy Docker w pliku Dockerfile:
Udostępnianie gniazda demona platformy Docker
Jak wspomniano wcześniej , naprawienie drugiego problemu oznacza uruchomienie kontenera Jenkins Docker, tak aby współdzielił gniazdo demona Dockera z demonem Dockera znajdującym się poza kontenerem. Musisz więc powiedzieć Jenkinsowi, aby uruchomił kontener Docker z tym udostępnianiem, w ten sposób:
Ustawianie identyfikatorów UID i GID
Idealnym rozwiązaniem trzeciego problemu byłoby utworzenie dodatkowych grup dla Agenta. Wydaje się to niemożliwe. Jedyną znaną mi poprawką jest uruchomienie agenta z UID Jenkinsa i Docker GID (gniazdo ma uprawnienia do zapisu grupowego i jest własnością
root.docker
). Ale ogólnie rzecz biorąc, nie wiesz, jakie są te identyfikatory (zostały przydzielone, gdyuseradd ... jenkins
igroupadd ... docker
uruchomiono, gdy Jenkins i Docker zostały zainstalowane na hoście). I nie możesz po prostu powiedzieć Jenkinsowi użytkownikowijenkins
i grupiedocker
dlatego, że opowiada Döcker używać użytkowników i grup, które są o nazwie
jenkins
idocker
na obrazie , a Docker obraz prawdopodobnie nie majenkins
użytkowników i grup, a nawet jeśli tak nie byłoby gwarancji, że to mają takie same UID i GID jako hosta i podobnie nie ma gwarancji, żedocker
GID jest taki samNa szczęście Jenkins uruchamia
docker build
polecenie dla twojego pliku Dockerfile w skrypcie, więc możesz wykonać magię skryptu powłoki, aby przekazać te informacje jako argumenty kompilacji Dockera:Który korzysta z
id
komendy, aby uzyskać UID i GID zjenkins
użytkownikiem istat
polecenia, aby uzyskać informacje na temat gniazda Docker.Twój Dockerfile mogą wykorzystać te informacje do konfiguracji z
jenkins
użytkownikiem idocker
grupy dla agenta, używającgroupadd
,groupmod
iuseradd
:źródło
-u jenkins:$(getent group docker | cut -d: -f3)
?args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
przezargs '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:jenkins --group-add docker'
Przekazywanie -u jenkins: docker, zmieniasz podstawową grupę użytkowników, co oznacza, że kiedy użytkownik napisze plik, powiedzmy w obszarze roboczym, ustawi plik użytkownika do jenkins, a grupa do dockera. Co prawdopodobnie nie jest tym, co zamierzamy.Mam Jenkins działający w Dockerze i podłączony Jenkins używa gniazda Docker z komputera hosta Ubuntu 16.04 przez wolumin do /var/run/docker.sock.
Dla mnie rozwiązaniem było:
1) Wewnątrz kontenera Docker Jenkinsa (
docker exec -it jenkins bash
na maszynie hosta)2) Na komputerze głównym:
664
oznacza - czytać i pisać (ale nie wykonywać) dla właściciela i użytkowników z grupy.źródło
Podczas konfigurowania produkcji wystąpił problem z uprawnieniami, wypróbowałem poniższe rozwiązanie, aby rozwiązać problem.
Komunikat o błędzie
Rozwiązanie: uprawnienia gniazda wskazane w komunikacie o błędzie, /var/run/docker.sock:
Po zmianie uprawnień dla docket.sock wykonaj poniższe polecenie, aby sprawdzić uprawnienia.
źródło
W moim przypadku konieczne było nie tylko dodanie
jenkins
użytkownika dodocker
grupy, ale uczynienie z tej grupy podstawowej grupyjenkins
użytkownika.Nie zapomnij o ponownym podłączeniu węzła jenkins slave lub zrestartowaniu serwera jenkins, w zależności od przypadku.
źródło
2019-02-16
Większość kroków była dla mnie taka sama, jak napisali inni. Nie udało mi się jednak dodać jenkinsa do grupy docker przy użyciu usermod z wymienionymi rozwiązaniami.
Wypróbowałem następujące polecenie z hosta platformy Docker iz uruchomionego kontenera platformy Docker :
(Wszedłem do uruchomionego kontenera docker za pomocą następującego polecenia z hosta dockera :
)
Odebrane od hosta dockera :
Odebrane z kontenera dockera :
Nie znałem hasła.
Bez
sudo
części polecenia w kontenerze docker otrzymałem:Rozwiązanie: Wszedłem do uruchomiony pojemnika Döcker z hostem Döcker za pomocą następującego polecenia:
Teraz wszedłem jako root i wydałem następujące polecenie:
Następnie z hosta dockera zrestartowałem mój działający kontener docker za pomocą następującego polecenia:
Potem zacząłem pracę u Jenkinsa i zakończyła się sukcesem.
Użyłem użytkownika root tylko do wydania
usermod
polecenia dla użytkownikajenkins
.źródło
2019-05-26
To zadziałało dla mnie!
Przykład docker-compose:
źródło
Napotkałem podobny problem, który jest problemem z uprawnieniami, a przyczyną tego problemu jest to, że demon / serwer Docker zawsze działa jako
root
użytkownik i chce, abyś zawsze poprzedzał polecenie dockersudo
.Demon Dockera wiąże się z gniazdem Unix zamiast portu TCP. Domyślnie to gniazdo Unix jest własnością użytkownika,
root
a inni użytkownicy mogą uzyskać do niego dostęp tylko za pomocąsudo
.Aby to naprawić, oto co zadziałało dla mnie:
Najpierw sprawdź, czy masz już utworzoną grupę docker:
Jeśli nie znajdziesz
docker
na wyświetlonej liście, musisz ją utworzyć:Następnie potwierdź swoje
user
i swoje,group
używając poniższego polecenia:Przewiń, aby zobaczyć grupę dla Dockera. Powinien mieć ten format
gdzie
docker
jest mójgroup
ipromisepreston
jest mójuser
Teraz możemy dodać użytkownika do grupy docker
Tylko dla plików kontenerów platformy Docker:
Skopiuj i uruchom poniższe polecenie w swoim terminalu dokładnie tak, jak jest podane, bez modyfikowania go w żaden sposób, niezależnie od obrazu / kontenera / polecenia dockera, które chcesz uruchomić lub próbujesz uruchomić, lub jest to przypadek problemu z uprawnieniami:
Po uruchomieniu powyższego polecenia musisz się wylogować i zalogować ponownie, aby ponownie ocenić członkostwo w grupie. Jednak w systemie Linux możesz również uruchomić następujące polecenie poniżej, aby aktywować zmiany w grupach ( Skopiuj i uruchom poniższe polecenie w terminalu dokładnie tak, jak jest podane, bez modyfikowania go w żaden sposób, niezależnie od obrazu / kontenera / polecenia dockera, które chcesz uruchomić lub próbujesz uruchomić, lub jest przyczyną problemu z uprawnieniami ):
Możesz teraz sprawdzić, czy możesz uruchamiać polecenia dockera bez uprawnień sudo, uruchamiając ponownie polecenie, które powoduje problem z uprawnieniami, powiedzmy ( Zastąp
my-command
nazwą obrazu / kontenera / polecenia ):W przypadku plików Dockera i lokalnego systemu plików:
Jeśli masz kopię plików w lokalnym systemie plików, możesz zmienić prawo własności do katalogu aplikacji, w którym przechowywane są pliki aplikacji, używając następującego formatu:
Więc w moim przypadku będzie to:
Uwaga: uruchom to polecenie w katalogu nadrzędnym, w którym znajduje się katalog aplikacji.
To wszystko.
mam nadzieję, że to pomoże
źródło
źródło
Uruchamiam Jenkinsa w kontenerze Dockera. Najprostszym rozwiązaniem dla mnie było stworzenie niestandardowego obrazu, który dynamicznie ustawia GID, na przykład:
Zobacz: https://github.com/jenkinsci/docker/issues/263
Alternatywnie możesz uruchomić jenkins z następującymi opcjami:
Zakłada się, że obraz Jenkins ma zainstalowanego klienta Docker. Zobacz: https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci
źródło
Jeśli możesz otrzymać błędy takie jak poniżej,
lub
Po prostu spróbuj wykonać następujące polecenia,
źródło
usermod -a -G docker jenkins
chown jenkins:docker /var/run/docker.sock
Używam oficjalnego obrazu Dockera Jenkinsa ( https://hub.docker.com/r/jenkins/jenkins ), ale myślę, że to rozwiązanie ma zastosowanie w większości przypadków użycia, w których chcemy uruchomić .
Zalecanym sposobem używania Dockera w kontenerze Docker jest użycie demona Dockera systemu hosta. Dobry artykuł na ten temat: https://itnext.io/docker-in-docker-521958d34efd .
Sekretem rozwiązania problemu uprawnień, którego dotyczy to pytanie, jest dodanie uprawnień dla użytkownika kontenera wewnątrz kontenera, a nie dla systemu hosta . Tylko użytkownik root ma do tego uprawnienia domyślnie, więc
zrobię to. Pamiętaj, aby ponownie uruchomić kontener.
Myślę, że najprostszym sposobem osiągnięcia tego jest utworzenie dostosowanego pliku Dockerfile:
źródło
Jeśli ktoś nadal napotyka problem na swoim komputerze lokalnym (Ubuntu), wypróbuj poniższe polecenie:
źródło
W moim przypadku to zadziała. przejdź do lokalnego repozytorium i wprowadź to polecenie.
źródło
Na serwerze, na którym działa Jenkins, użyłem
Następnie uruchom każdy kontener Dockera z
Używanie setfacl wydaje się lepszą opcją i nie jest potrzebne żadne "-u user". Kontenery są następnie uruchamiane jako ten sam użytkownik, na którym działa Jenkins. Byłbym jednak wdzięczny za wszelkie uwagi od ekspertów ds. Bezpieczeństwa.
źródło
użyj poniżej pliku dockerfile
źródło
w moim przypadku był to dopiero start usługi dockera:
źródło
często konieczne jest ponowne uruchomienie, aby zastosować nową grupę użytkowników i użytkownika.
źródło
Jeśli używasz Jenkinsa w kontenerze dockera, a Twój Jenkins łączy się z dokerem hosta, możesz to naprawić za pomocą poniższego pliku Dockerfile:
źródło
Może powinieneś uruchomić docker od samego początku z opcją "-u root"
Przynajmniej to rozwiązało mój problem
źródło
root
. Przynajmniej tak mi się przydarzyło w przypadku Dockera 18.06.1.