Корневой пароль внутри контейнера 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.