Корінний пароль всередині контейнера Docker


265

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

Тож мені треба бути корінцем. Я намагаюся команду su, але мене просять ввести кореневий пароль.

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


11
просто EXEC як корінь: docker exec -u 0 -it mycontainer bash. (див H6. відповідь)
Lenart

Відповіді:


494

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

docker exec -u 0 -it mycontainer bash

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

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


5
Було б непогано вказати, що вам потрібен мій контейнер і працює в той момент, коли ви набираєте вищевказану кому. він працює з використанням двох різних терміналів: один для mycontainer, а другий для цієї команди. В іншому випадку потрібно, щоб мій контейнер працював як від'єднаний.
nicolimo86

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

2
це відповідь, яка повинна бути зверху
D Пінто,

1
@ High6, коли ви говорите "Ви можете увійти в зображення Docker Image ...", я думаю, ви маєте на увазі "Ви можете увійти в контейнер Docker ".
lmiguelvargasf

Чи завжди це можливо? Або це можна заблокувати?
Сем Томас

82

Врешті-решт я вирішив відновити свої зображення Docker, щоб я змінив корінний пароль чимось, що буду знати.

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у докерфайлі перед утилітою USER.



23

Я в змозі змусити його працювати з командою нижче.

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

18

У мене була саме така проблема, що я не мав права викорінювати, оскільки я працював у контейнері як непривілейований користувач.

Але я не хотів перебудовувати новий образ, як підказують попередні відповіді.

Натомість я виявив, що я можу отримати доступ до контейнера як корінь за допомогою 'nsenter', дивіться: https://github.com/jpetazzo/nsenter

Спочатку визначте PID вашого контейнера на хості:

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

Потім за допомогою nsenter введіть контейнер як корінь

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

1
Використовуючи boot2docker, мені довелося скористатисяsudo nsenter --target <PID> --mount --uts --ipc --net --pid
peater

Так, хороший момент. Як правило, для виконання команд докера вам потрібні кореневі дозволи, і я думаю, що nsenter такий же. У своїй відповіді я цього не зрозуміла.
Річард Корфілд

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

Також докер має спеціальну обробку для хостів (і резолюції.conf). Не слід вручну редагувати їх; docker відтворює / etc / hosts на кожному початку, щоб відображати пов'язані контейнери тощо.
Кевін Кін


9

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

docker exec -it <MyContainer> bash

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

9

Для створення / зміни пароля root у запущеному контейнері

docker exec -itu root {containerName} passwd

5

Пароль "ubuntu" для користувача "ubuntu" (принаймні, в docker для ubuntu: 14.04.03).

Примітка: 'ubuntu' створюється після запуску контейнера, тому, якщо ви просто зробите це:

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

Ви отримаєте кореневу підказку безпосередньо. Звідти ви можете примусити пароль змінити корінь, зафіксувати контейнер і необов'язково позначити його (з -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: latest.


3

Я б запропонував кращого рішення - дати --add-host NAME:IPаргумент запуску докера при запуску контейнера. Це оновить /etc/hosts/файл, не потребуючи коріння.

В іншому випадку ви можете змінити USERналаштування, надавши -u USERпрапор docker run. Однак я б радив проти цього, оскільки ви не повинні насправді міняти речі в запущеному контейнері. Натомість внесіть свої зміни в Dockerfile і створіть нове зображення.


Мені потрібно додати записи у файл хостів, поки контейнер працює.
guillaume

Мені також потрібно встановити новий пакет, але я не можу, оскільки я не root.
guillaume

1
Ви можете використовувати -uпрапор, щоб змінити користувача. Я не думаю, що ти можеш це зробити зсередини контейнера.
Адріан Муат

2

Ви можете використовувати кореневу команду USER у своєму Dockerfile.


2

Коли ви запустите контейнер, ви будете мати root, але ви не будете знати, що таке pw кореня. Щоб встановити його на щось, що ви знаєте, просто використовуйте "rootwd root". Знімок / фіксація контейнера для збереження ваших дій.


1

За замовчуванням докер-контейнери працюють як rootкористувач.

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

Приклад -

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

0

спробуйте наступну команду, щоб отримати кореневий доступ

$ sudo -i 

Це навряд чи вдасться, якщо у вас не буде облікового запису в налаштуваннях контейнера з доступом до sudo. Це було б незвичною ситуацією і порушило б те, щоб користувач не-root користувався контейнером.
Йосія

Хтось знає пароль DEFAULT для встановлення Docker? Я спробував запустити висоту і там один набір.
Патрік Бервелл

Це працювало в WSL2 після експорту зображення докера та імпорту в WSL2. Звідти просто зробіть passwd, щоб встановити пароль для 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.