Docker容器内的root密码

Root password inside a Docker container

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

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

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


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

1
docker exec -u 0 -it mycontainer bash

root (id = 0) is the default user within a container. The image
developer can create additional users. Those users are accessible by
name. When passing a numeric ID, the user does not have to exist in
the container.

来自Docker文档

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

docker container exec -u 0 -it mycontainer bash


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

1
RUN echo 'root:Docker!' | chpasswd

要么

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


有两种方法可以做到这一点。

  • 运行Docker覆盖USER设置

    1
     docker exec -u 0 -it containerName bash
  • 要么

    1
    docker exec -u root -it --workdir / <containerName> bash
  • 在Docker文件中构建映像期间,请获得必要的文件权限等

  • 如果您的Linux映像中所有软件包均可用,请在Docker档案中之前的chpasswd

  • 有关完整参考,请访问:http://muralitechblog.com/root-password-of-a-docker-container/


    我可以通过以下命令使用它。

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

    1
    docker exec -u 0 -it containername bash

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

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

    相反,我发现我可以使用'nsenter'作为根用户访问该容器,请参见:https://github.com/jpetazzo/nsenter

    首先确定主机上容器的PID:

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

    然后使用nsenter以根用户身份进入容器

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


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

    1
    docker exec -itu root {containerName} passwd

    获取您正在运行的容器的shell并更改root pass。

    1
    2
    3
    4
    5
    docker exec -it <MyContainer> bash

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

    ``ubuntu''用户的密码是``ubuntu''(至少在docker中是ubuntu:14.04.03)。

    注意:" ubuntu"是在容器启动后创建的,因此,如果您这样做:

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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的最终依赖关系。


    您可以通过使用root用户身份以SSH方式登录docker容器

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

    然后使用它更改root密码

    1
    passwd root

    通过输入以下命令确保已安装sudo

    1
    sudo

    如果未安装,请安装

    1
    apt-get install sudo

    如果要授予用户dev的sudo权限,可以将用户dev添加到sudo组

    1
    usermod -aG sudo dev

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

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

    1
    sudo ls -la /root

    输入开发人员的密码

    如果您的用户在适当的组中,并且您正确输入了密码,则使用sudo发出的命令应以root特权运行。


    我建议一个更好的解决方案是在启动容器时为docker run提供--add-host NAME:IP参数。这将更新/etc/hosts/文件,而无需成为root用户。

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


    您可以在Dockerfile中使用USER root命令。


    启动容器时,您将是root用户,但您将不知道root用户的pw是什么。要将其设置为您知道的内容,只需使用" passwd root"。快照/提交容器以保存操作。


    默认情况下,Docker容器以root用户身份运行。

    如果您仍在使用容器,则可以使用exit命令返回到root(默认用户)用户,而不用再次运行容器。

    范例-

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

    在某些情况下,您需要能够在具有sudo的用户下执行类似的操作(例如,容器中运行的应用程序为用户提供了外壳)。只需将其添加到您的Dockerfile中:

    1
    2
    3
    4
    5
    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下,您将能够使用第3行中设置的密码来sudo

    在此处或此处查看如何为useradd生成密码哈希。


    尝试以下命令以获取root访问权限

    1
    $ sudo -i