Contraseña de root dentro de un contenedor Docker

265

Estoy usando una imagen Docker que fue construida usando el comando USER para usar un usuario no root llamado dev. Dentro de un contenedor, soy "dev", pero quiero editar el /etc/hostsarchivo.

Entonces necesito ser root. Estoy probando el comando su, pero se me pide que ingrese la contraseña de root.

¿Cuál es la contraseña predeterminada del usuario raíz dentro de un contenedor Docker?

guillaume
fuente
11
exec simplemente como una raíz: docker exec -u 0 -it mycontainer bash. (ver H6respuesta)
Sławomir Lenart

Respuestas:

495

Puede iniciar sesión en el contenedor Docker utilizando el usuario raíz (ID = 0) en lugar del usuario predeterminado proporcionado cuando utiliza la -uopción. P.ej

docker exec -u 0 -it mycontainer bash

root (id = 0) es el usuario predeterminado dentro de un contenedor. El desarrollador de imágenes puede crear usuarios adicionales. Esos usuarios son accesibles por nombre. Al pasar una identificación numérica, el usuario no tiene que existir en el contenedor.

de la documentación de Docker

H6.
fuente
55
Sería bueno especificar que necesita mycontainer en funcionamiento en el momento en que escribe el comando anterior. funciona usando 2 terminales diferentes: uno para mycontainer y el otro para este comando. De lo contrario, requiere que mycontainer se ejecute como desconectado.
nicolimo86
66
para imágenes, usedocker run -u 0 -it mycontainer bash
Pavel 'PK' Kaminsky
2
esta es la respuesta que debería estar en la cima
D Pinto
1
@ High6, cuando dice "Puede iniciar sesión en la imagen de Docker ...", creo que quiere decir "Puede iniciar sesión en el Contenedor de Docker ".
lmiguelvargasf
¿Es esto siempre posible? ¿O puede ser bloqueado?
Sam Thomas
82

Finalmente, decidí reconstruir mis imágenes de Docker, para cambiar la contraseña de root por algo que sabré.

RUN echo 'root:Docker!' | chpasswd

o

RUN echo 'Docker!' | passwd --stdin root 
guillaume
fuente
55
Intenté esto pero no funciona en mi docker basado en CentOS 6. ¿Este comando funciona en Docker basado en CentOS?
Dragan Nikolic
28

Hay un par de maneras de hacerlo.

  1. Para ejecutar el Docker anulando la configuración de USUARIO

    docker exec -u 0 -it containerName bash
    

o

docker exec -u root -it --workdir / <containerName> bash
  1. Haga los permisos de archivo necesarios, etc., durante la creación de la imagen en el archivo Docker

  2. Si todos los paquetes están disponibles en su imagen de Linux, chpasswden el dockerfile antes de la utilidad USER.

Muralidharan.rade
fuente
23

Puedo hacerlo funcionar con el siguiente comando.

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

Tuve exactamente este problema de no poder su a root porque estaba corriendo en el contenedor como un usuario sin privilegios.

Pero no quería reconstruir una nueva imagen como sugieren las respuestas anteriores.

En cambio, descubrí que podía acceder al contenedor como root usando 'nsenter', consulte: https://github.com/jpetazzo/nsenter

Primero determine el PID de su contenedor en el host:

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

Luego use nsenter para ingresar al contenedor como root

nsenter --target <PID> --mount --uts --ipc --net --pid
Richard Corfield
fuente
1
Usando boot2docker, tuve que usarsudo nsenter --target <PID> --mount --uts --ipc --net --pid
peater
Si, buen punto. Por lo general, necesita permisos de root para ejecutar comandos de Docker y supongo que nsenter es lo mismo. No dejé esto totalmente claro en mi respuesta.
Richard Corfield
44
Desde que se escribió esta respuesta, Docker ha agregado el comando exec para hacer básicamente lo mismo que nsenter, pero más fácil y limpio. Solo un punto de datos para aquellos que ahora encuentran esta pregunta a través de la búsqueda. El comando es "docker exec -it <containername> <command>" (el comando suele ser / bin / bash, pero, por supuesto, puede hacer lo que quiera).
Kevin Keane
Además, Docker tiene un tratamiento especial para los hosts (y resolv.conf). No debe editarlos manualmente; docker recrea / etc / hosts en cada inicio para reflejar contenedores vinculados y similares.
Kevin Keane
18
docker exec -u 0 -it containername bash
usuario128364
fuente
9

Obtenga un shell de su contenedor en ejecución y cambie la contraseña de root:

docker exec -it <MyContainer> bash

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

Para crear / cambiar una contraseña de root en un contenedor en ejecución

docker exec -itu root {containerName} passwd
Del mes próximo
fuente
5

La contraseña es 'ubuntu' para el usuario 'ubuntu' (al menos en docker para ubuntu: 14.04.03).

NB: 'ubuntu' se crea después del inicio del contenedor, así que si solo haces esto:

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

Obtendrá el indicador raíz directamente. Desde allí, puede forzar el cambio de contraseña de root, confirmar el contenedor y, opcionalmente, etiquetarlo (con -f) en ubuntu: último como este:

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

Debe reconstruir sus eventuales dependencias en ubuntu: latest.

usuario1853859
fuente
3

Sugeriría una mejor solución es dar el --add-host NAME:IPargumento a Docker Run al iniciar el contenedor. Eso actualizará el /etc/hosts/archivo sin necesidad de convertirse en root.

De lo contrario, puede anular la USERconfiguración dando la -u USERbandera a docker run. Sin embargo, desaconsejaría esto, ya que realmente no debería estar cambiando las cosas en un contenedor en ejecución. En su lugar, realice sus cambios en un Dockerfile y cree una nueva imagen.

Adrian Mouat
fuente
Necesito agregar entradas en el archivo de hosts mientras se ejecuta el contenedor.
guillaume
También necesito instalar un nuevo paquete, pero no puedo porque no soy root.
guillaume
1
Puede usar la -ubandera para cambiar de usuario. No creo que puedas hacerlo desde el interior del contenedor.
Adrian Mouat
2

Puede usar el comando root del USUARIO en su Dockerfile.

naveen kumar
fuente
2

Cuando inicies el contenedor, serás root pero no sabrás cuál es la raíz de pw. Para establecerlo en algo que conozca, simplemente use "passwd root". Instantánea / confirme el contenedor para guardar sus acciones.

JohnBabrick
fuente
1

Por defecto, los contenedores Docker se ejecutan como el rootusuario.

Si todavía está usando el contenedor, puede usar el exitcomando para volver al rootusuario (usuario predeterminado) en lugar de volver a ejecutar el contenedor.

Ejemplo

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

pruebe el siguiente comando para obtener el acceso raíz

$ sudo -i 
Abhishek DK
fuente
Es poco probable que esto funcione a menos que tenga la cuenta en la configuración del contenedor con acceso a sudo. Esta sería una situación inusual y rompería el punto de tener un usuario no root ejecutando el contenedor.
Josías
¿Alguien sabe la contraseña predeterminada de su para la instalación de Docker? Traté de ejecutar la elevación y hay un conjunto.
Patrick Burwell
Esto funcionó en WSL2 después de exportar la imagen acoplable e importarla a WSL2. A partir de ahí, simplemente haga passwd para establecer la contraseña para root. Regrese al usuario no root e intente sudo su o su. Ahora funcionará.
WSLUser
0

En algunos casos, debe poder hacer cosas así con un usuario sudo(por ejemplo, la aplicación que se ejecuta en el contenedor proporciona un shell a los usuarios). Simplemente agregue esto en su 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

Ahora, con el usuario de imagen predeterminado user, podrá hacerlo sudocon la contraseña establecida en la línea 3.

Vea cómo generar hash de contraseña useradd aquí o aquí .

greatvovan
fuente