Mot de passe root dans un conteneur Docker

265

J'utilise une image Docker qui a été créée à l'aide de la commande USER pour utiliser un utilisateur non root appelé dev. À l'intérieur d'un conteneur, je suis "dev", mais je souhaite modifier le /etc/hostsfichier.

Je dois donc être root. J'essaye la commande su, mais on me demande d'entrer le mot de passe root.

Quel est le mot de passe de l'utilisateur root par défaut dans un conteneur Docker?

Guillaume
la source
11
juste exec comme racine: docker exec -u 0 -it mycontainer bash. (voir H6la réponse de)
Sławomir Lenart

Réponses:

495

Vous pouvez vous connecter au conteneur Docker à l'aide de l'utilisateur root (ID = 0) au lieu de l'utilisateur par défaut fourni lorsque vous utilisez l' -uoption. Par exemple

docker exec -u 0 -it mycontainer bash

root (id = 0) est l'utilisateur par défaut dans un conteneur. Le développeur d'images peut créer des utilisateurs supplémentaires. Ces utilisateurs sont accessibles par leur nom. Lors de la transmission d'un ID numérique, l'utilisateur n'a pas besoin d'exister dans le conteneur.

de la documentation Docker

H6.
la source
5
Ce serait bien de spécifier que vous avez besoin que mycontainer soit opérationnel au moment où vous tapez la commande ci-dessus. il fonctionne en utilisant 2 terminaux différents: un pour mycontainer et l'autre pour cette commande. Sinon, cela nécessite que mycontainer fonctionne en tant que détaché.
nicolimo86
6
pour les images, utilisezdocker run -u 0 -it mycontainer bash
Pavel 'PK' Kaminsky
2
c'est la réponse qui devrait être au top
D Pinto
1
@ High6, lorsque vous dites "Vous pouvez vous connecter à l'image Docker ...", je pense que vous voulez dire "Vous pouvez vous connecter au Docker Container ".
lmiguelvargasf
Est-ce toujours possible? Ou cela peut-il être bloqué?
Sam Thomas
82

Finalement, j'ai décidé de reconstruire mes images Docker, afin de changer le mot de passe root par quelque chose que je saurai.

RUN echo 'root:Docker!' | chpasswd

ou

RUN echo 'Docker!' | passwd --stdin root 
Guillaume
la source
5
J'ai essayé mais cela ne fonctionne pas sur mon docker basé sur CentOS 6. Cette commande fonctionne-t-elle sur le docker basé sur CentOS?
Dragan Nikolic
28

Il y a plusieurs façons de procéder.

  1. Pour exécuter le Docker en remplaçant le paramètre USER

    docker exec -u 0 -it containerName bash
    

ou

docker exec -u root -it --workdir / <containerName> bash
  1. Créez les autorisations de fichier nécessaires, etc., lors de la création de l'image dans le fichier Docker

  2. Si tous les packages sont disponibles dans votre image Linux, chpasswddans le dockerfile avant l'utilitaire USER.

Muralidharan.rade
la source
23

Je peux le faire fonctionner avec la commande ci-dessous.

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

J'ai eu exactement ce problème de ne pas pouvoir su à root parce que je courais dans le conteneur en tant qu'utilisateur non privilégié.

Mais je ne voulais pas reconstruire une nouvelle image comme le suggèrent les réponses précédentes.

Au lieu de cela, j'ai constaté que je pouvais accéder au conteneur en tant que root en utilisant 'nsenter', voir: https://github.com/jpetazzo/nsenter

Déterminez d'abord le PID de votre conteneur sur l'hôte:

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

Utilisez ensuite nsenter pour entrer le conteneur en tant que root

nsenter --target <PID> --mount --uts --ipc --net --pid
Richard Corfield
la source
1
En utilisant boot2docker, j'ai dû utilisersudo nsenter --target <PID> --mount --uts --ipc --net --pid
peater
Oui, bon point. Vous avez généralement besoin des autorisations root pour exécuter les commandes docker et je suppose que nsenter est le même. Je n'ai pas précisé cela clairement dans ma réponse.
Richard Corfield
4
Depuis que cette réponse a été écrite, docker a ajouté la commande exec pour faire essentiellement la même chose que nsenter, mais plus facile et plus propre. Juste un point de données pour ceux qui trouvent maintenant cette question grâce à la recherche. La commande est "docker exec -it <containername> <command>" (la commande est généralement / bin / bash, mais vous pouvez bien sûr faire ce que vous voulez).
Kevin Keane
En outre, docker a un traitement spécial pour les hôtes (et resolv.conf). Vous ne devez pas les modifier manuellement; docker recrée / etc / hosts à chaque démarrage pour refléter les conteneurs liés et similaires.
Kevin Keane
18
docker exec -u 0 -it containername bash
user128364
la source
9

Obtenez un shell de votre conteneur en cours d'exécution et modifiez le mot de passe root:

docker exec -it <MyContainer> bash

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

Pour créer / modifier un mot de passe root dans un conteneur en cours d'exécution

docker exec -itu root {containerName} passwd
Proximo
la source
5

Le mot de passe est 'ubuntu' pour l'utilisateur 'ubuntu' (au moins dans docker pour ubuntu: 14.04.03).

NB: 'ubuntu' est créé après le démarrage du conteneur donc, si vous faites juste ceci:

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

Vous obtiendrez directement l'invite root. De là, vous pouvez forcer le changement de mot de passe de root, valider le conteneur et éventuellement le taguer (avec -f) sur ubuntu: latest comme ceci:

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

Vous devez reconstruire vos éventuelles dépendances sur ubuntu: latest.

user1853859
la source
3

Je suggérerais qu'une meilleure solution consiste à donner l' --add-host NAME:IPargument de docker run lors du démarrage du conteneur. Cela mettra à jour le/etc/hosts/ fichier sans avoir besoin de devenir root.

Sinon, vous pouvez remplacer le USERparamètre en attribuant le -u USERdrapeau à docker run. Je déconseille cependant cela, car vous ne devriez pas vraiment changer les choses dans un conteneur en cours d'exécution. Au lieu de cela, apportez vos modifications dans un Dockerfile et créez une nouvelle image.

Adrian Mouat
la source
J'ai besoin d'ajouter des entrées dans le fichier hosts pendant que le conteneur est en cours d'exécution.
Guillaume
J'ai également besoin d'installer un nouveau package, mais je ne peux pas car je ne suis pas root.
Guillaume
1
Vous pouvez utiliser l' -uindicateur pour changer d'utilisateur. Je ne pense pas que vous puissiez le faire depuis l'intérieur du conteneur.
Adrian Mouat
2

Vous pouvez utiliser la commande root USER dans votre Dockerfile.

naveen kumar
la source
2

Lorsque vous démarrez le conteneur, vous serez root mais vous ne saurez pas quel est le pw de root. Pour le régler sur quelque chose que vous connaissez, utilisez simplement "root passwd". Capturez / validez le conteneur pour enregistrer vos actions.

JohnBabrick
la source
1

Par défaut, les conteneurs Docker s'exécutent en tant que root qu'utilisateur.

Si vous utilisez toujours le conteneur, vous pouvez utiliser la exitcommande pour revenir àroot utilisateur (utilisateur par défaut) au lieu d'exécuter à nouveau le conteneur.

Exemple -

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

essayez la commande suivante pour obtenir l'accès root

$ sudo -i 
Abhishek DK
la source
Il est peu probable que cela fonctionne, sauf si vous avez le compte dans la configuration du conteneur avec accès sudo. Ce serait une situation inhabituelle et casser le point d'avoir un utilisateur non root exécutant le conteneur.
Josiah
Quelqu'un connaît-il le mot de passe par défaut pour l'installation de Docker? J'ai essayé d'exécuter l'élévation et il y en a un ensemble.
Patrick Burwell
Cela a fonctionné dans WSL2 après l'exportation de l'image docker et l'importation dans WSL2. À partir de là, faites simplement passwd pour définir le mot de passe root. Revenez à l'utilisateur non root et essayez sudo su ou su. Cela va maintenant fonctionner.
WSLUser
0

Dans certains cas, vous devez être capable de faire des choses comme ça sous un utilisateur avec sudo(par exemple, l'application exécutée dans le conteneur fournit un shell aux utilisateurs). Ajoutez simplement ceci dans votre 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

Maintenant, sous l'utilisateur d'image par défaut, uservous pourrezsudo avec le mot de passe défini sur la ligne 3.

Découvrez comment générer un hachage de mot de passe pour useradd ici ou ici .

greatvovan
la source