【问题标题】:Root password inside a Docker containerDocker容器内的root密码
【发布时间】:2015-04-27 14:31:13
【问题描述】:

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

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

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

【问题讨论】:

  • 以 root 身份执行:docker exec -u 0 -it mycontainer bash。 (见H6的回答)

标签: docker


【解决方案1】:

获取正在运行的容器的外壳并更改根路径。

docker exec -u 0 -it <MyContainer> bash

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

【讨论】:

  • OP在不知道密码是什么的情况下如何更改密码?
  • @MEMark 如果您是 root,则不会询问您当前密码...
【解决方案2】:

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

docker exec -itu 0 {container} passwd

【讨论】:

  • 你救了我的培根
  • 这个应该是可以接受的答案!
【解决方案3】:

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

  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 中。

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

【讨论】:

    【解决方案4】:

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

    docker exec -u 0 -it mycontainer bash
    

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

    from Docker documentation

    更新:当然你也可以使用容器的Docker管理命令来运行这个:

    docker container exec -u 0 -it mycontainer bash

    【讨论】:

    • 当您输入上述命令时,最好指定您需要 mycontainer 启动并运行。它使用 2 个不同的终端工作:一个用于 mycontainer,另一个用于此命令。否则,它要求 mycontainer 以分离方式运行。
    • 图片使用docker run -u 0 -it mycontainer bash
    • 这是应该放在首位的答案
    • @High6,当你说“你可以登录 Docker Image...”时,我想你的意思是“你可以登录 Docker Container”。跨度>
    • 这总是可能的吗?或者这可以被阻止吗?
    【解决方案5】:

    您可以使用 SSH 以 root 身份登录到 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的密码

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

    【讨论】:

      【解决方案6】:

      在某些情况下,您需要能够在具有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 下,您将能够使用第 3 行设置的密码sudo

      了解如何为useradd herehere 生成密码哈希。

      【讨论】:

        【解决方案7】:

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

        RUN echo 'root:Docker!' | chpasswd
        

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

        【讨论】:

        • 我试过这个,但它不适用于我的基于 CentOS 6 的 docker。此命令是否适用于基于 CentOS 的 docker?
        • 为什么不要求输入两次密码?
        【解决方案8】:

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

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

        例子-

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

        【讨论】:

          【解决方案9】:

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

          【讨论】:

            【解决方案10】:

            尝试以下命令获取root权限

            $ sudo -i 
            

            【讨论】:

            • 除非您在容器设置中拥有具有 sudo 访问权限的帐户,否则这不太可能起作用。这将是一种不寻常的情况,并且会破坏让非 root 用户运行容器的点。
            • 有人知道 Docker 安装的默认 su 密码吗?我试图运行海拔,有一套。
            • 这在导出 docker 映像并导入 WSL2 后在 WSL2 中起作用。从那里,只需执行 passwd 来设置 root 的密码。退出到非 root 用户并尝试 sudo su 或 su。它现在可以工作了。
            【解决方案11】:

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

            【讨论】:

              【解决方案12】:

              我可以使用下面的命令让它工作。

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

              【讨论】:

                【解决方案13】:
                docker exec -u 0 -it containername bash
                

                【讨论】:

                  【解决方案14】:

                  “ubuntu”用户的密码是“ubuntu”(至少在 docker 中用于 ubuntu :14.04.03)。

                  注意:'ubuntu' 是在容器启动后创建的,所以,如果你这样做:

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

                  您将直接获得根提示。从那里您可以强制更改 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 的最终依赖项。

                  【讨论】:

                    【解决方案15】:

                    我确实遇到了无法 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
                    

                    【讨论】:

                    • 使用boot2docker,我不得不使用sudo nsenter --target &lt;PID&gt; --mount --uts --ipc --net --pid
                    • 是的,好点。您通常需要 root 权限才能执行 docker 命令,我猜 nsenter 是一样的。我没有在回答中完全清楚地说明这一点。
                    • 自从写了这个答案后,docker 添加了命令 exec 来做与 nsenter 基本相同的事情,但更简单、更干净。对于那些现在通过搜索找到这个问题的人来说,这只是一个数据点。命令是“docker exec -it ”(命令通常是/bin/bash,但你当然可以为所欲为)。
                    • 此外,docker 对主机(和 resolv.conf)有特殊处理。您不应该手动编辑它们; docker 在每次启动时重新创建 /etc/hosts 以反映链接的容器等。
                    【解决方案16】:

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

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

                    【讨论】:

                    • 我需要在容器运行时在 hosts 文件中添加条目。
                    • 我还需要安装新包,但我不能,因为我不是root。
                    • 您可以使用-u 标志来更改用户。我不认为你可以从容器内部做到这一点。
                    猜你喜欢
                    • 1970-01-01
                    • 2015-12-15
                    • 2020-05-21
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-06-23
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-07-04
                    相关资源
                    最近更新 更多