以root以外的用户身份连接到docker容器

以root以外的用户身份连接到docker容器,docker,containers,root,Docker,Containers,Root,默认情况下,当您运行 docker run-it[myimage] 或 docker-attach[mycontainer] 您以root用户身份连接到终端,但我希望以其他用户身份连接。这可能吗 您可以在Dockerfile中指定用户。所有后续操作都将使用该帐户执行。如果只希望在启动容器时(而不是在构建映像时)使用该用户,则可以在CMD或ENTRYPOINT前指定USER一行。从生成的图像启动容器时,您将作为指定用户附加。对于docker run: 只需添加选项--user,即可在启动docke

默认情况下,当您运行

docker run-it[myimage]

docker-attach[mycontainer]


您以root用户身份连接到终端,但我希望以其他用户身份连接。这可能吗

您可以在Dockerfile中指定
用户
。所有后续操作都将使用该帐户执行。如果只希望在启动容器时(而不是在构建映像时)使用该用户,则可以在
CMD
ENTRYPOINT
前指定
USER
一行。从生成的图像启动容器时,您将作为指定用户附加。

对于
docker run

只需添加选项
--user
,即可在启动docker容器时更改为其他用户

docker run -it --user nobody busybox
对于
docker-attach
docker-exec

由于该命令用于附加/执行到现有进程中,因此它直接使用那里的当前用户

docker run -it busybox  # CTRL-P/Q to quit
docker attach <container id>  # then you have root user
/ # id
uid=0(root) gid=0(root) groups=10(wheel)

docker run -it --user nobody busybox # CTRL-P/Q to quit
docker attach <container id>  
/ $ id
uid=99(nobody) gid=99(nogroup)
docker run-it busybox\CTRL-P/Q退出
docker attach#那么您有根用户
/#id
uid=0(根目录)gid=0(根目录)组=10(控制盘)
docker run-it--用户nobody busybox#CTRL-P/Q退出
码头工人
/$id
uid=99(无人)gid=99(无组)
如果您真的想连接到您想要拥有的用户,那么

  • 从该用户开始运行--user或使用
    user
  • 使用'su'更改用户

  • 您可以使用以下命令在正在运行的docker容器中运行shell:


    docker exec-it--user root/bin/bash

    我能让它工作的唯一方法是:

    docker run -it -e USER=$USER -v /etc/passwd:/etc/passwd -v `pwd`:/siem mono bash
    su - magnus
    
    因此,我必须在/etc/passwd文件中指定$USER环境变量和一个点。通过这种方式,我可以在/siem文件夹中编译,并保留那里文件的所有权,而不是作为根目录。

    我的解决方案:

    #!/bin/bash
    user_cmds="$@"
    
    GID=$(id -g $USER)
    UID=$(id -u $USER)
    RUN_SCRIPT=$(mktemp -p $(pwd))
    (
    cat << EOF
    addgroup --gid $GID $USER
    useradd --no-create-home --home /cmd --gid $GID --uid $UID  $USER
    cd /cmd
    runuser -l $USER -c "${user_cmds}"
    EOF
    ) > $RUN_SCRIPT
    
    trap "rm -rf $RUN_SCRIPT" EXIT
    
    docker run -v $(pwd):/cmd --rm my-docker-image "bash /cmd/$(basename ${RUN_SCRIPT})"
    
    其中
    cross\u compile.sh
    是上面显示的脚本。
    addgroup/useradd
    机制允许用户拥有由生成创建的任何文件/目录


    虽然这对我们有用。它看起来有点像黑客。我对其他实现持开放态度…

    作为www-data-user执行命令:
    docker-exec-t--user www-data-container bash-c“ls-la”
    用于
    docker-compose
    。在
    docker compose.yml
    中:

    version: '3'
    services:
        app:
            image: ...
            user: ${UID:-0}
    ...
    
    .env
    中:

    UID=1000
    

    作为2020年的更新答案--用户,-u选项是用户名或UID(格式:[:])

    然后,对我来说是这样的

    docker exec -it -u root:root container /bin/bash
    

    参考:

    这解决了我的使用案例,即:“在运行WSL2 Docker Desktop的Windows上的nodejs容器中编译网页包内容,并在当前登录的用户下拥有构建的资产。”

    根据作者的回答。谢谢大家!


    这些材料也帮助我了解了正在发生的事情。

    是的<代码>docker run--用户用户名附加没有这样的选项。您必须以root用户身份登录,然后
    su user\u name
    root用户是默认用户
    --我想,当命令必须以root用户身份运行时,可以省略user
    选项。@情况并非总是如此,因为默认用户可以通过
    user
    指令在Dockerfile中自定义,请参见另一个永不忘记将Home设置为“按原样运行”,但指导我找到工作解决方案。非常感谢。
    docker exec -it -u root:root container /bin/bash
    
    docker run -u 1000 -v "$PWD":/build -w /build node:10.23 /bin/sh -c 'npm install && npm run build'