Hasło roota w kontenerze Docker

265

Używam obrazu Docker, który został zbudowany za pomocą polecenia USER, aby użyć użytkownika innego niż root o nazwie dev. Wewnątrz kontenera jestem „dev”, ale chcę edytować /etc/hostsplik.

Więc muszę być rootem. Próbuję polecenia su, ale jestem proszony o podanie hasła roota.

Jakie jest domyślne hasło użytkownika root w kontenerze Docker?

guillaume
źródło
11
tylko exec jako root: docker exec -u 0 -it mycontainer bash. (patrz H6odpowiedź)
Sławomir Lenart

Odpowiedzi:

494

Możesz zalogować się do kontenera Docker przy użyciu użytkownika root (ID = 0) zamiast podanego domyślnego użytkownika, gdy korzystasz z tej -uopcji. Na przykład

docker exec -u 0 -it mycontainer bash

root (id = 0) jest domyślnym użytkownikiem w kontenerze. Twórca obrazu może tworzyć dodatkowych użytkowników. Ci użytkownicy są dostępni według nazwy. Podczas przekazywania identyfikatora numerycznego użytkownik nie musi istnieć w kontenerze.

z dokumentacji Docker

H6
źródło
5
Byłoby miło określić, że potrzebujesz mojego kontenera w momencie, gdy wpiszesz powyższe polecenie. działa przy użyciu 2 różnych terminali: jeden dla mycontainer i drugi dla tego polecenia. W przeciwnym razie mój kontener musi działać jako odłączony.
nicolimo86,
6
do zdjęć użyjdocker run -u 0 -it mycontainer bash
Pavel 'PK' Kaminsky
2
to odpowiedź powinna być na górze
D Pinto
1
@ High6, kiedy mówisz „Możesz zalogować się do Docker Image ...”, myślę, że masz na myśli „Możesz zalogować się do Docker Container ”.
lmiguelvargasf
Czy to zawsze jest możliwe? Czy może to zostać zablokowane?
Sam Thomas
82

W końcu postanowiłem odbudować moje obrazy Dockera, aby zmienić hasło roota na coś, co będę wiedział.

RUN echo 'root:Docker!' | chpasswd

lub

RUN echo 'Docker!' | passwd --stdin root 
guillaume
źródło
5
Próbowałem tego, ale to nie działa na moim dokerze opartym na CentOS 6. Czy to polecenie działa w oknie dokowanym opartym na CentOS?
Dragan Nikolic
28

Można to zrobić na kilka sposobów.

  1. Aby uruchomić Docker zastępujący ustawienie USER

    docker exec -u 0 -it containerName bash
    

lub

docker exec -u root -it --workdir / <containerName> bash
  1. Dokonaj niezbędnych uprawnień do plików itp. Podczas kompilacji obrazu w pliku Docker

  2. Jeśli wszystkie pakiety są dostępne w obrazie Linuksa, chpasswdw pliku dokera przed narzędziem USER.

Muralidharan.rade
źródło
23

Jestem w stanie sprawić, że będzie działać z poniższym poleceniem.

root@gitnew:# docker exec -it --user $(username) $(containername) /bin/bash
Mansur Ali
źródło
18

Miałem dokładnie ten problem, że nie mogłem su do rootowania, ponieważ działałem w kontenerze jako nieuprzywilejowany użytkownik.

Ale nie chciałem odbudowywać nowego obrazu, jak sugerują poprzednie odpowiedzi.

Zamiast tego odkryłem, że mogę uzyskać dostęp do kontenera jako root za pomocą „nsenter”, patrz: https://github.com/jpetazzo/nsenter

Najpierw określ PID swojego kontenera na hoście:

docker inspect --format {{.State.Pid}} <container_name_or_ID>

Następnie użyj nsenter, aby wprowadzić kontener jako root

nsenter --target <PID> --mount --uts --ipc --net --pid
Richard Corfield
źródło
1
Korzystając z boot2docker, musiałem użyćsudo nsenter --target <PID> --mount --uts --ipc --net --pid
peater
Tak, dobra uwaga. Zasadniczo potrzebujesz uprawnień roota do wykonywania poleceń dokera i myślę, że nsenter jest taki sam. W mojej odpowiedzi nie wyjaśniłem tego całkowicie.
Richard Corfield,
4
Od czasu napisania tej odpowiedzi doker dodał komendę exec, aby zrobić to samo co nsenter, ale łatwiej i czystiej. Tylko punkt danych dla tych, którzy teraz znajdą to pytanie poprzez wyszukiwanie. Polecenie to „docker exec -it <nazwa_kontenera> <polecenie>” (zwykle jest to / bin / bash, ale oczywiście możesz zrobić, co chcesz).
Kevin Keane
Ponadto doker ma specjalne traktowanie hostów (i resolv.conf). Nie powinieneś ich ręcznie edytować; docker odtwarza / etc / hosts na każdym początku, aby odzwierciedlić połączone kontenery i tym podobne.
Kevin Keane
18
docker exec -u 0 -it containername bash
użytkownik128364
źródło
9

Uzyskaj powłokę działającego kontenera i zmień hasło roota:

docker exec -it <MyContainer> bash

root@MyContainer:/# passwd
Enter new UNIX password:
Retype new UNIX password:
DimiDak
źródło
9

Aby utworzyć / zmienić hasło roota w działającym kontenerze

docker exec -itu root {containerName} passwd
Proximo
źródło
5

Hasło to „ubuntu” dla użytkownika „ubuntu” (przynajmniej w oknie dokowanym dla ubuntu: 14.04.03).

Uwaga: „Ubuntu” jest tworzone po uruchomieniu kontenera, więc jeśli tylko to zrobisz:

 docker run -i -t --entrypoint /bin/bash  ubuntu     

Otrzymasz monit o rootowanie bezpośrednio. Stamtąd możesz wymusić zmianę hasła roota, zatwierdzić kontener i opcjonalnie oznaczyć go (-f) na Ubuntu: najnowsze jak to:

root@ec384466fbbb:~# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root@ec384466fbbb:~# exit

% docker commit ec3844
5d3c03e7d6d861ce519fe33b184cd477b8ad03247ffe19b2a57d3f0992d71bca

docker tag -f 5d3c ubuntu:latest

Musisz odbudować swoje ewentualne zależności od Ubuntu: najnowszy.

użytkownik1853859
źródło
3

Sugeruję, że lepszym rozwiązaniem jest podanie --add-host NAME:IPargumentu do uruchomienia dokera podczas uruchamiania kontenera. To zaktualizuje/etc/hosts/ plik bez potrzeby rootowania.

W przeciwnym razie możesz zmienić USERustawienie, podając -u USERflagę do docker run. Odradzałbym to jednak, ponieważ tak naprawdę nie powinieneś zmieniać rzeczy w działającym kontenerze. Zamiast tego wprowadź zmiany w Dockerfile i utwórz nowy obraz.

Adrian Mouat
źródło
Muszę dodać wpisy do pliku hosts, gdy kontener jest uruchomiony.
guillaume,
Muszę także zainstalować nowy pakiet, ale nie mogę, ponieważ nie jestem rootem.
guillaume,
1
Możesz użyć -uflagi, aby zmienić użytkownika. Nie sądzę, że możesz to zrobić z wnętrza pojemnika.
Adrian Mouat
2

Możesz użyć polecenia root USER w swoim pliku Docker.

naveen kumar
źródło
2

Po uruchomieniu kontenera będziesz rootem, ale nie będziesz wiedział, co to jest pw roota. Aby ustawić to na coś, co znasz, po prostu użyj „passwd root”. Zrób migawkę / zatwierdź kontener, aby zapisać swoje działania.

JohnBabrick
źródło
1

Domyślnie kontenery dokowane działają jako rootużytkownik.

Jeśli nadal używasz kontenera, możesz użyć exitpolecenia, aby wrócić doroot użytkownika (domyślnego użytkownika) zamiast ponownie uruchamiać kontener.

Przykład -

[dev@6c4c86bccf93 ~]$ ls
[dev@6c4c86bccf93 ~]$ other-commands..
[dev@6c4c86bccf93 ~]$ exit
[root@6c4c86bccf93 /]# ls
Mithilesh Tipkari
źródło
0

spróbuj wykonać następujące polecenie, aby uzyskać dostęp do konta root

$ sudo -i 
Abhishek DK
źródło
Jest to mało prawdopodobne, chyba że masz konto w konfiguracji kontenera z dostępem sudo. To byłaby niezwykła sytuacja i złamanie punktu, w którym użytkownik inny niż root uruchamia kontener.
Josiah
Czy ktoś zna DOMYŚLNE hasło do instalacji Docker? Próbowałem uruchomić elewację i tam jest jeden zestaw.
Patrick Burwell
Działa to w WSL2 po wyeksportowaniu obrazu dokera i zaimportowaniu do WSL2. Stamtąd zrób passwd, aby ustawić hasło dla roota. Wróć do użytkownika innego niż root i wypróbuj sudo su lub su. Teraz będzie działać.
WSLUser
0

W niektórych przypadkach musisz mieć możliwość robienia takich rzeczy pod użytkownikiem za pomocą sudo(np. Aplikacja działająca w kontenerze zapewnia użytkownikom powłokę). Po prostu dodaj to do swojego Dockerfile:

RUN apt-get update         # If necessary
RUN apt-get install sudo   # If your base image does not contain sudo.
RUN useradd -m -N -s /bin/bash -u 1000 -p '$1$miTOHCYy$K.c4Yw.edukWJ7z9rbpTZ0' user && \
    usermod -aG sudo user  # Grant sudo to the user
USER user

Teraz pod domyślnym użytkownikiem obrazu userbędziesz mógł, sudoużywając hasła ustawionego w linii 3.

Zobacz, jak wygenerować skrót hasłem useradd tutaj lub tutaj .

greatvovan
źródło