作为 root 用户以外的用户连接到 docker 容器

默认情况下运行

docker run -it [myimage]

OR

docker attach [mycontainer]

您以 root 用户的身份连接到终端,但我想以另一个用户的身份连接。这可能吗?

188909 次浏览

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

对于 docker run:

只需添加选项 --user <user>,以便在启动 Docker 容器时更改为另一个用户。

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>开始,或者使用 USERDockerfile中提到它
  2. change the user using `su

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

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

唯一的办法就是:

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

我使用这个工作流允许我的 dev-team 为 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机制允许用户对构建创建的任何文件/目录拥有所有权。

虽然这对我们很有用,但是看起来有点古怪,我对其他的实现方式持开放态度。

作为 www-data 用户执行命令: docker exec -t --user www-data container bash -c "ls -la"

For docker-compose. In the docker-compose.yml:

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

In .env:

UID=1000

作为从2020年更新的答案。 --user-u选项是 Username or UID (format: <name|uid>[:<group|gid>])

然后,它像这样为我工作,

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

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

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

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

基于 eigenfield的答案。谢谢!

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