Password di root all'interno di un container Docker


292

Sto usando un'immagine Docker che è stata creata utilizzando il comando USER per utilizzare un utente non root chiamato dev. All'interno di un contenitore, sono "dev", ma voglio modificare il /etc/hostsfile.

Quindi devo essere root. Sto provando il comando su, ma mi viene chiesto di inserire la password di root.

Qual è la password dell'utente root predefinita all'interno di un container Docker?


12
Basta eseguire come root: docker exec -u 0 -it mycontainer bash. (vedi H6risposta di)
Sławomir Lenart

Risposte:


546

È possibile accedere al contenitore Docker utilizzando l'utente root (ID = 0) anziché l'utente predefinito fornito quando si utilizza l' -uopzione. Per esempio

docker exec -u 0 -it mycontainer bash

root (id = 0) è l'utente predefinito all'interno di un contenitore. Lo sviluppatore dell'immagine può creare utenti aggiuntivi. Questi utenti sono accessibili per nome. Quando si passa un ID numerico, l'utente non deve esistere nel contenitore.

dalla documentazione Docker

Aggiornamento : ovviamente puoi anche utilizzare il comando di gestione Docker per i contenitori per eseguire questo:

docker container exec -u 0 -it mycontainer bash


5
Sarebbe bello specificare che hai bisogno di mycontainer attivo e funzionante nel momento in cui digiti il ​​comando sopra. funziona utilizzando 2 terminali differenti: uno per mycontainer e l'altro per questo comando. In caso contrario, richiede che mycontainer sia in esecuzione come scollegato.
nicolimo86

6
per le immagini, usadocker run -u 0 -it mycontainer bash
Pavel 'PK' Kaminsky

2
questa è la risposta che dovrebbe essere in cima
D Pinto

1
@ High6, quando dici "Puoi accedere all'immagine Docker ...", penso che intendi "Puoi accedere al Docker Container ".
lmiguelvargasf

È sempre possibile? O può essere bloccato?
Sam Thomas,

94

Alla fine, ho deciso di ricostruire le mie immagini Docker, in modo da cambiare la password di root con qualcosa che saprò.

RUN echo 'root:Docker!' | chpasswd

o

RUN echo 'Docker!' | passwd --stdin root 

5
Ho provato questo ma non funziona sulla mia finestra mobile basata su CentOS 6. Questo comando funziona sulla finestra mobile basata su CentOS?
Dragan Nikolic

31

Ci sono un paio di modi per farlo.

  1. Per eseguire il Docker sovrascrivendo l'impostazione USER

     docker exec -u 0 -it containerName bash
    

o

docker exec -u root -it --workdir / <containerName> bash
  1. Effettua le autorizzazioni necessarie per i file, ecc., Durante la creazione dell'immagine nel file Docker

  2. Se tutti i pacchetti sono disponibili nell'immagine Linux, chpasswdnel dockerfile prima dell'utilità USER.

Per riferimento completo: http://muralitechblog.com/root-password-of-a-docker-container/


26

Sono in grado di farlo funzionare con il comando seguente.

root@gitnew:# docker exec -it --user $(username) $(containername) /bin/bash


19

Ho avuto esattamente questo problema di non essere in grado di eseguire il su to root perché stavo eseguendo nel container come utente non privilegiato.

Ma non volevo ricostruire una nuova immagine come suggeriscono le risposte precedenti.

Invece ho scoperto che potevo accedere al container come root usando 'nsenter', vedi: https://github.com/jpetazzo/nsenter

Per prima cosa determina il PID del tuo contenitore sull'host:

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

Quindi utilizzare nsenter per accedere al contenitore come root

nsenter --target <PID> --mount --uts --ipc --net --pid

1
Usando boot2docker, ho dovuto usaresudo nsenter --target <PID> --mount --uts --ipc --net --pid
peater

Sì, buon punto. In genere sono necessari i permessi di root per eseguire i comandi docker e immagino che nsenter sia lo stesso. Non l'ho chiarito del tutto nella mia risposta.
Richard Corfield

4
Da quando è stata scritta questa risposta, docker ha aggiunto il comando exec per fare praticamente la stessa cosa di nsenter, ma più semplice e pulito. Solo un punto dati per coloro che ora trovano questa domanda attraverso la ricerca. Il comando è "docker exec -it <containername> <command>" (il comando è solitamente / bin / bash, ma ovviamente puoi fare quello che vuoi).
Kevin Keane

Inoltre, docker ha un trattamento speciale per gli host (e resolv.conf). Non dovresti modificarli manualmente; docker ricrea / etc / hosts ad ogni avvio per riflettere i contenitori collegati e simili.
Kevin Keane

16

Per creare / modificare una password di root in un contenitore in esecuzione

docker exec -itu root {containerName} passwd

11

Ottieni una shell del tuo container in esecuzione e cambia il passaggio di root.

docker exec -it <MyContainer> bash

root@MyContainer:/# passwd
Enter new UNIX password: 
Retype new UNIX password: 

6

La password è "ubuntu" per l'utente "ubuntu" (almeno nella finestra mobile per ubuntu: 14.04.03).

NB: 'ubuntu' viene creato dopo l'avvio del contenitore quindi, se fai questo:

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

Riceverai direttamente il prompt di root. Da lì puoi forzare la modifica della password di root, eseguire il commit del contenitore e facoltativamente taggarlo (con -f) in ubuntu: latest in questo modo:

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

Devi ricostruire le tue eventuali dipendenze su Ubuntu: latest.


3

Suggerirei che una soluzione migliore sia fornire l' --add-host NAME:IPargomento per docker run all'avvio del container. Ciò aggiornerà il /etc/hosts/file senza bisogno di diventare root.

Altrimenti, puoi sovrascrivere l' USERimpostazione dando il -u USERflag a docker run. Lo sconsiglio tuttavia, poiché non dovresti davvero cambiare le cose in un contenitore in esecuzione. Invece, apporta le tue modifiche in un Dockerfile e crea una nuova immagine.


Devo aggiungere voci nel file hosts mentre il contenitore è in esecuzione.
guillaume

Devo anche installare un nuovo pacchetto, ma non posso perché non sono root.
guillaume

1
Puoi usare il -uflag per cambiare utente. Non credo che tu possa farlo dall'interno del contenitore.
Adrian Mouat

3

È possibile accedere tramite SSH al contenitore docker come root utilizzando

docker exec -it --user root <container_id> /bin/bash

Quindi cambia la password di root usando questo

passwd root

Assicurati che sudo sia installato controlla inserendo

sudo

se non è installato installalo

apt-get install sudo

Se vuoi dare i permessi sudo per user dev puoi aggiungere user dev al gruppo sudo

usermod -aG sudo dev

Ora sarai in grado di eseguire comandi di livello sudo dal tuo utente dev mentre sei all'interno del contenitore oppure puoi passare a root all'interno del contenitore utilizzando la password che hai impostato in precedenza.

Per testarlo accedere come user dev ed elencare il contenuto della directory root che normalmente è accessibile solo all'utente root.

sudo ls -la /root

Inserisci la password per dev

Se il tuo utente è nel gruppo corretto e hai inserito la password correttamente, il comando che hai emesso con sudo dovrebbe essere eseguito con i privilegi di root.



2

Quando avvii il contenitore, sarai root ma non saprai quale sia la pw di root. Per impostarlo su qualcosa che conosci, usa semplicemente "passwd root". Snapshot / commit del contenitore per salvare le tue azioni.


1

Per impostazione predefinita, i contenitori Docker vengono eseguiti come rootutente.

Se stai ancora utilizzando il contenitore, puoi utilizzare il exitcomando per tornare rootall'utente (utente predefinito) invece di eseguire nuovamente il contenitore.

Esempio -

[dev@6c4c86bccf93 ~]$ ls
[dev@6c4c86bccf93 ~]$ other-commands..
[dev@6c4c86bccf93 ~]$ exit
[root@6c4c86bccf93 /]# ls

1

In alcuni casi è necessario essere in grado di fare cose del genere sotto un utente con sudo(ad esempio, l'applicazione in esecuzione nel contenitore fornisce una shell agli utenti). Aggiungilo semplicemente al tuo 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

Ora sotto l'immagine predefinita utente usersarai in grado di farlo sudocon la password impostata sulla riga 3.

Guarda come generare l'hash della password useradd qui o qui .


0

prova il seguente comando per ottenere l'accesso root

$ sudo -i 

È improbabile che funzioni a meno che non si disponga dell'account nella configurazione del contenitore con accesso sudo. Questa sarebbe una situazione insolita e spezzerebbe il punto di avere un utente non root che esegue il contenitore.
Josiah,

Qualcuno conosce la password su DEFAULT per l'installazione Docker? Ho provato a eseguire l'elevazione e c'è un set.
Patrick Burwell

Questo ha funzionato in WSL2 dopo aver esportato l'immagine Docker e importato in WSL2. Da lì, basta eseguire passwd per impostare la password per root. Esci di nuovo dall'utente non root e prova sudo su o su. Ora funzionerà.
WSLUser
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.