Корневой пароль внутри контейнера Docker


265

Я использую образ Docker, который был создан с помощью команды USER, чтобы использовать пользователя без полномочий root с именем dev. Внутри контейнера я "dev", но я хочу отредактировать /etc/hostsфайл.

Так что мне нужно быть пользователем root. Я пытаюсь выполнить команду su, но меня просят ввести пароль root.

Какой пароль пользователя root по умолчанию находится внутри контейнера Docker?


11
просто exec как рут docker exec -u 0 -it mycontainer bash. (см. H6ответ)
Славомир Ленарт

Ответы:


495

Вы можете войти в контейнер Docker, используя пользователя root (ID = 0) вместо предоставленного пользователя по умолчанию при использовании этой -uопции. Например

docker exec -u 0 -it mycontainer bash

root (id = 0) - пользователь по умолчанию в контейнере. Разработчик изображений может создавать дополнительных пользователей. Эти пользователи доступны по имени. При передаче числового идентификатора пользователь не должен существовать в контейнере.

из документации Docker


5
Было бы неплохо указать, что mycontainer должен быть запущен и запущен в тот момент, когда вы вводите запятую. он работает, используя 2 разных терминала: один для mycontainer, а другой для этой команды. В противном случае требуется, чтобы mycontainer работал как отдельный.
nicolimo86

6
для изображений, используйтеdocker run -u 0 -it mycontainer bash
Павел 'PK' Каминский

2
это ответ, который должен быть сверху
D Пинто

1
@ High6, когда вы говорите «Вы можете войти в Docker Image ...», я думаю, что вы имеете в виду «Вы можете войти в Docker Container ».
lmiguelvargasf

Это всегда возможно? Или это можно заблокировать?
Сэм Томас

82

В конце концов, я решил перестроить свои образы Docker, чтобы я изменил пароль root на то, что я буду знать.

RUN echo 'root:Docker!' | chpasswd

или

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

5
Я попробовал это, но это не работает на моем докере на базе CentOS 6. Эта команда работает на докере на базе CentOS?
Драган Николич

28

Есть несколько способов сделать это.

  1. Чтобы запустить Docker, переопределяющий настройку USER

    docker exec -u 0 -it containerName bash
    

или

docker exec -u root -it --workdir / <containerName> bash
  1. Сделайте необходимые права доступа к файлу и т. Д. Во время сборки образа в файле Docker

  2. Если все пакеты доступны в вашем образе Linux, chpasswdв файле docker перед утилитой USER.



23

Я могу заставить его работать с помощью приведенной ниже команды.

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

18

У меня возникла именно эта проблема, связанная с невозможностью получить права суперпользователя, потому что я работал в контейнере как непривилегированный пользователь.

Но я не хотел перестраивать новый образ, как предлагают предыдущие ответы.

Вместо этого я обнаружил, что могу получить доступ к контейнеру как root с помощью 'nsenter', см. Https://github.com/jpetazzo/nsenter.

Сначала определите PID вашего контейнера на хосте:

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

Затем используйте nsenter для входа в контейнер как root

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

1
Используя boot2docker, мне пришлось использоватьsudo nsenter --target <PID> --mount --uts --ipc --net --pid
peater

Да, хорошая мысль. Обычно вам нужны права root для выполнения команд Docker, и я предполагаю, что nsenter такой же. Я не сделал это полностью ясно в своем ответе.
Ричард Корфилд

4
С тех пор как этот ответ был написан, docker добавил команду exec, чтобы сделать в основном то же самое, что и nsenter, но проще и чище. Просто точка данных для тех, кто сейчас находит этот вопрос через поиск. Это команда "docker exec -it <containername> <command>" (обычно это команда / bin / bash, но вы, конечно, можете делать все, что захотите).
Кевин Кин

Кроме того, докер имеет специальный режим для хостов (и resolv.conf). Вы не должны редактировать их вручную; При каждом запуске docker воссоздает / etc / hosts для отражения связанных контейнеров и тому подобного.
Кевин Кин


9

Получите оболочку вашего работающего контейнера и измените пароль root:

docker exec -it <MyContainer> bash

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


5

Пароль для пользователя 'Ubuntu' 'Ubuntu' (по крайней мере, в Docker для Ubuntu: 14.04.03).

NB: «ubuntu» создается после запуска контейнера, поэтому, если вы просто сделаете это:

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

Вы получите приглашение root напрямую. Оттуда вы можете принудительно изменить пароль root, зафиксировать контейнер и при желании пометить его (с -f) в Ubuntu: последний, например, так:

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

Вы должны восстановить свои возможные зависимости от Ubuntu: последние.


3

Я бы посоветовал лучшее решение - дать --add-host NAME:IPаргумент запуску Docker при запуске контейнера. Это обновит /etc/hosts/файл без необходимости становиться пользователем root.

В противном случае вы можете изменить USERнастройку, установив -u USERфлажок docker run. Однако я бы посоветовал против этого, так как вы не должны менять вещи в работающем контейнере. Вместо этого внесите изменения в Dockerfile и создайте новый образ.


Мне нужно добавить записи в файле hosts, когда контейнер работает.
Гийом

Мне также нужно установить новый пакет, но я не могу, так как я не root.
Гийом

1
Вы можете использовать -uфлаг, чтобы изменить пользователя. Я не думаю, что вы можете сделать это из контейнера.
Адриан Муат


2

Когда вы запустите контейнер, вы будете пользователем root, но вы не будете знать, что такое pw root. Чтобы установить что-то, что вы знаете, просто используйте «пароль root». Сделайте снимок / зафиксируйте контейнер, чтобы сохранить ваши действия.


1

По умолчанию Docker-контейнеры запускаются от имени rootпользователя.

Если вы все еще используете контейнер, вы можете использовать exitкоманду, чтобы вернуться к rootпользователю (пользователь по умолчанию), вместо того, чтобы снова запускать контейнер.

Пример -

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

0

попробуйте следующую команду, чтобы получить root-доступ

$ sudo -i 

Это вряд ли сработает, если у вас нет учетной записи в настройке контейнера с доступом sudo. Это было бы необычной ситуацией и сломало бы пункт, не имеющий пользователя root, запускающего контейнер.
Иосия

Кто-нибудь знает пароль DEFAULT su для установки Docker? Я попытался запустить возвышение, и есть один набор.
Патрик Беруэлл

Это работало в WSL2 после экспорта образа докера и импорта в WSL2. Оттуда просто сделайте passwd, чтобы установить пароль для root. Вернитесь к пользователю без полномочий root и попробуйте sudo su или su. Теперь это будет работать.
WSLUser

0

В некоторых случаях вам нужно иметь возможность делать такие вещи под пользователем sudo(например, приложение, запущенное в контейнере, предоставляет оболочку для пользователей). Просто добавьте это в свой 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

Теперь под пользователем изображения по умолчанию userвы сможете sudoустановить пароль в строке 3.

Посмотрите, как создать хэш пароля useradd здесь или здесь .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.