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

时间:2016-03-01 22:02:27

标签: docker containers root

默认运行时

B.py

OR

C.py

您以root用户身份连接到终端,但我想以其他用户身份进行连接。这可能吗?

9 个答案:

答案 0 :(得分:41)

docker run

只需添加选项--user <user>即可在启动泊坞窗容器时更改为其他用户。

docker run -it --user nobody busybox

适用于docker attachdocker 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)

如果您真的想要附加到您想要的用户,那么

  1. 从该用户run --user <user>开始,或使用Dockerfile
  2. USER中提及该用户
  3. 使用`su
  4. 更改用户

答案 1 :(得分:31)

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

docker exec -it --user root <container id> /bin/bash

答案 2 :(得分:5)

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

答案 3 :(得分:1)

我能够使其发挥作用的唯一方法是:

docker run -it -e USER=$USER -v /etc/passwd:/etc/passwd -v `pwd`:/siem mono bash
su - magnus

所以我必须同时指定$ USER环境变量以及/ etc / passwd文件。通过这种方式,我可以在/ siem文件夹中编译并保留文件的所有权,而不是root。

答案 4 :(得分:1)

我的解决方案:

#!/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})"

这允许用户使用my-docker-image提供的工具运行任意命令。请注意用户当前工作目录是如何装入卷的 到容器内的/cmd

我正在使用这个工作流程允许我的开发团队为arm64目标交叉编译C / C ++代码,我维护的是bsp(my-docker-image包含交叉编译器,sysroot,make,cmake,等等)。有了这个,用户可以简单地执行以下操作:

cd /path/to/target_software
cross_compile.sh "mkdir build; cd build; cmake ../; make"

cross_compile.sh是上面显示的脚本。 addgroup/useradd机制允许用户拥有构建创建的任何文件/目录。

虽然这对我们有用。这看起来有点像hacky。我愿意接受其他实施......

答案 5 :(得分:0)

以www-data用户身份执行命令:-m

答案 6 :(得分:0)

对于docker-compose。在docker-compose.yml中:

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

.env中:

UID=1000

答案 7 :(得分:0)

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

然后,它像这样对我有用

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

参考:https://docs.docker.com/engine/reference/commandline/exec/

答案 8 :(得分:0)

这解决了我的用例:“在运行带WSL2的Docker桌面的Windows上的nodejs容器中编译webpack内容,并将已构建的资产保存在当前登录的用户下。”

docker run -u 1000 -v "$PWD":/build -w /build node:10.23 /bin/sh -c 'npm install && npm run build'

基于eigenfield的回答。谢谢!

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