Docker容器内的root密码


264

我正在使用Docker映像构建,该映像是使用USER命令构建的,以使用名为的非root用户dev。在容器内,我是“ dev”,但我想编辑该/etc/hosts文件。

所以我需要成为根。我正在尝试su命令,但要求输入root密码。

Docker容器中默认的root用户密码是什么?


11
仅以exec作为根:docker exec -u 0 -it mycontainer bash。(见H6的回答)
斯瓦沃米尔Lenart

Answers:


494

使用该-u选项时,您可以使用root用户(ID = 0)而不是提供的默认用户登录Docker容器。例如

docker exec -u 0 -it mycontainer bash

root(id = 0)是容器中的默认用户。图像开发人员可以创建其他用户。这些用户可以通过名称访问。传递数字ID时,用户不必在容器中。

来自Docker文档


5
最好指定在键入上述命令时需要mycontainer并使其运行。它可以使用2种不同的终端工作:一种用于mycontainer,另一种用于此命令。否则,它要求mycontainer以分离状态运行。
nicolimo86 '16

6
对于图像,使用docker run -u 0 -it mycontainer bash
Pavel'PK'Kaminsky

2
这应该是最重要的答案
D Pinto '18

1
@ High6,当您说“您可以登录Docker映像...”时,我想您的意思是“您可以登录Docker 容器 ”。
lmiguelvargasf

这总是可能吗?还是可以阻止它?
Sam Thomas

82

最终,我决定重建我的Docker映像,以便通过我知道的方式更改root密码。

RUN echo 'root:Docker!' | chpasswd

要么

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

5
我尝试了此操作,但在基于CentOS 6的Docker上不起作用。此命令在基于CentOS的Docker上是否有效?
Dragan Nikolic

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实用程序之前的dockerfile中。




18

正是由于我以非特权用户身份在容器中运行,所以无法运行root用户。

但是我不想像先前的答案所建议的那样重建新图像。

相反,我发现我可以使用“ 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

是的,很好。您通常需要root权限才能执行docker命令,我想nsenter是相同的。我的回答没有完全清楚。
理查德·科菲尔德

4
自从编写了此答案以来,docker已添加命令exec来执行与nsenter基本上相同的操作,但更加简便和简洁。对于那些现在通过搜索找到此问题的人来说,这只是一个数据点。命令是“ docker exec -it <容器名称> <命令>”(命令通常是/ bin / bash,但是您当然可以做任何您想做的事情)。
凯文·基恩

此外,docker对主机(和resolv.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     

您将直接获得root提示。从那里,您可以强制更改root用户的密码,提交容器并选择(使用-f标记)到ubuntu:latest,如下所示:

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在启动容器时为docker run 提供参数。这将更新/etc/hosts/文件,而无需成为root用户。

否则,您可以USER通过将-u USER标志赋予来覆盖设置docker run。但我建议您不要这样做,因为您不应该真正更改正在运行的容器中的内容。相反,请在Dockerfile中进行更改并构建新映像。


我需要在容器运行时在hosts文件中添加条目。
guillaume

我还需要安装新软件包,但由于不是root用户所以不能。
guillaume

1
您可以使用该 -u标志来更改用户。我认为您不能从容器内部进行操作。
阿德里安·穆阿特


2

启动容器时,您将是root用户,但您将不知道root用户的pw是什么。要将其设置为您知道的内容,只需使用“ passwd 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用户运行容器的问题。
约西亚

有人知道Docker安装的DEFAULT su密码吗?我试图进行海拔调整,但有一套。
Patrick Burwell

在导出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 在此处此处了解如何生成密码哈希。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.