繁体   English   中英

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

[英]Connect to docker container as user other than root

默认运行时

docker run -it [myimage]

或者

docker attach [mycontainer]

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

对于docker run

启动 docker 容器时,只需添加选项--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>或使用USER在您的Dockerfile提及它
  2. 使用 `su 更改用户

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

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

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

作为 2020 年的更新答案。 --user ,-u 选项是用户名或 UID(格式:<name|uid>[:<group|gid>])。

然后,它像这样对我有用,

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

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

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

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

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

我的解决方案:

#!/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。 我对替代实现持开放态度......

以 www-data 用户身份执行命令: 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

这解决了我的用例:“在使用 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的回答。 谢谢!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM