2017-02-10 31 views
12

Mam docker w konfiguracji docker dla CI. Zasadniczo maszyna ma serwer CI z jenkins, który używa tego samego gniazda dokowanego do tworzenia węzłów dla CI.Docker w błędzie Docker permissions

To działało świetnie, dopóki nie zaktualizowałem ostatnio okna dokowania. Zidentyfikowaliśmy problem, ale nie potrafię znaleźć odpowiedniej magii, aby to zadziałało.

host $ docker exec -it myjenkins bash 
[email protected] $ docker ps 
Got permission denied while trying to connect to the Docker daemon 
socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/json: dial unix /var/run/docker.sock: connect: permission denied 

host $ docker exec -it -u root -it myjenkins bash 
[email protected] $ docker ps 
... docker ps from host container yay! ... 

Oto, co przypuszczam. Mam dostęp do gniazda dokowanego hosta z poziomu kontenera, ale nie mogę wydawać pozwolenia użytkownikowi Jenkins.

Dodałem grupę doków, a także dodałem użytkownika jenkins do grupy docker. Ale wciąż mam ten sam błąd. Znowu zacząłem walić razy, więc nie jestem pewien, co robić dalej.

Czy istnieje sposób na wymuszenie uprawnień dla użytkownika na określonym gnieździe?

+0

Tak z ciekawości, czy spróbować to samo z uprzywilejowanej pojemnika (jako root w środku)? –

+0

Jeśli spojrzysz na moje pytanie, gdzie przedstawiam konsolę. Pokazałem, że próbowałem jako użytkownik jenkins, a następnie ponownie jako użytkownik root kontenera. Użytkownik root ma dostęp, użytkownik jenkins nie. –

+0

Po prostu z ciekawości, czy spróbowałeś tego samego z pojemnikiem * uprzywilejowanym * (jak jenkins wewnątrz) –

Odpowiedz

13

Musisz odwzorować gid grupy dokerów na swoim hoście na grupę grupy, do której należy jenkins wewnątrz kontenera. Oto przykład z mojego Dockerfile, jak I został zbudowany wizerunek Jenkins Slave:

ARG DOCKER_GID=993 

RUN groupadd -g ${DOCKER_GID} docker \ 
    && curl -sSL https://get.docker.com/ | sh \ 
    && apt-get -q autoremove \ 
    && apt-get -q clean -y \ 
    && rm -rf /var/lib/apt/lists/* /var/cache/apt/*.bin 

RUN useradd -m -d /home/jenkins -s /bin/sh jenkins \ 
    && usermod -aG docker jenkins 

993 dzieje się GID dokowanym na komputerze w tym przykładzie, że chcesz dostosować, aby dopasować swoje środowisko.


Rozwiązanie z PO: Jeśli przebudowa nie jest to możliwe można ustawić grupę Döcker odpowiednio w użyciu korzeń i dodać użytkownika. Jeśli próbował tego wcześniej może trzeba usunąć grupę na slave (groupdel docker):

docker exec -it -u root myjenkins bash 
container $ groupadd -g 993 docker 
container $ usermod -aG docker jenkins 
+0

OK. Widzę. Na pasku zadań hosta znajduje się 999. W oknie dokowanym Slave jest 1001. Więc mówisz, że muszę się upewnić, że gid na slave jest taki sam jak host? Czy myślisz, że mogę uciec po prostu edycji '/ etc/group'? –

+1

Gid w pliku docker.sock musi również być gid użytkownika wewnątrz kontenera. Możesz utworzyć dowolną grupę wewnątrz obrazu o tym id i dodać Jenkinsa do tej grupy. Zmiana/etc/group na hoście nie będzie działać bez poprawiania uprawnień do plików. – BMitch

+1

Doskonały doskonały doskonały. Zamierzam zaktualizować twoją odpowiedź za pomocą mojej poprawki. –

0

Wykonaj polecenia z uprawnieniami roota przez sudo w tym starcie.

0

Osobiście po prostu musiał to zrobić:

sudo gpasswd -a $USER docker 

I wyszło

Powiązane problemy