Docker容器中的root密码

484

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

所以我需要成为超级用户。 我尝试su命令,但要求输入root密码。

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


43
执行以下命令以使用root身份进入容器:docker exec -u 0 -it mycontainer bash。(请参见“H6”的回答) - Sławomir Lenart
21个回答

842
您可以使用根用户(ID = 0)登录Docker容器,而不是使用提供的默认用户,当您使用-u选项时。例如:
docker exec -u 0 -it mycontainer bash

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

来自 Docker 文档

更新:当然,您也可以使用用于容器管理的 Docker 命令来运行此命令:

docker container exec -u 0 -it mycontainer bash


8
在输入上述命令时,最好指定您需要立即运行 mycontainer。此命令需要使用两个不同的终端:一个用于 mycontainer,另一个用于此命令。否则,需要将 mycontainer 作为分离运行。 - nicolimo86
19
针对图片,请使用命令 docker run -u 0 -it mycontainer bash。该命令表示以 root 用户身份进入名为 "mycontainer" 的容器,并启动 Bash 终端。 - Pavel 'PK' Kaminsky
3
这是应该置顶的答案。 - D Pinto
2
@High6,当你说“你可以登录Docker镜像…”时,我认为你的意思是“你可以登录Docker_容器_”。 - lmiguelvargasf
如果你必须使用 kubectl,那么这不是一个选项。 - Arber
显示剩余4条评论

147

最终,我决定重建我的Docker镜像,这样我就可以将root密码更改为我知道的东西。

RUN echo 'root:Docker!' | chpasswd
或者
RUN echo 'Docker!' | passwd --stdin root 

7
我尝试过这个命令,但它在我基于CentOS 6的docker上不起作用。这个命令在基于CentOS的docker上能用吗? - Dragan Nikolic
为什么它不会要求输入两次密码? - Gulzar
1
你能解释一下你的命令执行了什么吗? - Charlie Parker
@CharlieParker这两个命令都旨在通过管道传递root用户的密码给更改密码命令。尽管我在尝试获取solr Docker容器的root访问权限时,这两个选项都没有起作用。 - Gautam
这个解决方案似乎已经不再有效。在以Ubuntu 23.04为基础镜像进行测试时失败了。实际上,我的容器操作系统的默认shell需要root登录。在提示符下,我从stdin输入root密码两次,但当我提供正确的密码时,即相应镜像的Dockerfile中指定的密码时,我被拒绝访问。 - Cbhihe
现在只要有访问容器镜像的权限,任何人都可以轻松地看到Docker!密码。为了安全起见,可以采用在Docker和Compose v1中构建安全的方式中描述的docker build --secret方法。 - Peter V. Mørch

68

有几种方法可以实现。

  1. 覆盖 USER 设定以运行 Docker。

 docker exec -u 0 -it containerName bash

或者

docker exec -u root -it --workdir / <containerName> bash
  1. 在Docker文件中进行镜像构建期间,进行必要的文件权限设置等操作。

  2. 如果您的Linux镜像中已有所有包,则可以在使用USER工具之前的dockerfile中使用chpasswd命令。

完整参考文献:http://muralitechblog.com/root-password-of-a-docker-container/


58

在运行中的容器中创建/更改根密码

docker exec -itu 0 {container} passwd

5
你救了我的一命。 - Henrique Felix
2
这个应该是一个被接受的答案! - zer0hedge
其他的都差不多,但这个确实有实质内容。 - Spokes
3
注:passwd不是你的密码。字面上,你必须输入passwd,然后它会要求你输入密码。 - Mert Mertce

27

我能够使用以下命令使其运行。

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

25
获取正在运行的容器的 shell 并更改 root 密码。
docker exec -u 0 -it <MyContainer> bash

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

当用户不知道密码时,该如何更改密码? - MEMark
3
@MEMark 如果您是root用户,则不需要输入当前密码... - DimiDak

24
docker exec -u 0 -it containername bash

20

由于我在容器中作为非特权用户运行,所以我无法使用su命令切换到root用户,我恰好遇到了这个问题。

但是,我不想像之前的答案建议的那样重新构建一个新镜像。

相反,我发现我可以使用'nsenter'作为root访问容器,请参见: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也是一样的。我在回答中没有完全明确这一点。 - Richard Corfield
5
自从这个答案写出来以后,Docker 已经添加了一个名为 exec 的命令,可以基本上做与 nsenter 相同的事情,但更加简单和清洁。对于那些通过搜索找到这个问题的人来说,这只是一个数据点。命令是 "docker exec -it <containername> <command>"(常用的命令是 /bin/bash,但你当然可以做任何你想做的事情)。 - Kevin Keane
此外,Docker 对主机(和 resolv.conf)有特殊处理。您不应手动编辑它们;Docker 在每次启动时重新创建 /etc/hosts,以反映链接的容器等内容。 - Kevin Keane

10

您可以使用以下命令以 root 身份 SSH 进入 Docker 容器:

docker exec -it --user root <container_id> /bin/bash

然后使用此命令更改 root 密码

passwd root

确保已安装sudo,通过输入以下命令进行检查

sudo

如果没有安装,就安装它

apt-get install sudo

如果您想为用户 dev 授予sudo权限,可以将用户dev添加到sudo组中。

usermod -aG sudo dev

现在您可以在容器内以dev用户身份运行sudo级别的命令,或者您可以使用先前设置的密码切换到容器内的root用户。

要进行测试,请以用户dev身份登录并列出通常只能由root用户访问的根目录内容。

sudo ls -la /root

输入dev的密码

如果您的用户在正确的组内并且您正确输入了密码,则以root权限运行sudo命令。


9

在Ubuntu 14.04.03的docker中,'ubuntu'用户的密码为'ubuntu'。

注意:'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上重新构建您的最终依赖项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接