以 root 以外的用户身份连接到 docker 容器
Connect to docker container as user other than root
默认情况下 运行
docker run -it [myimage]
或
docker attach [mycontainer]
您以 root 用户身份连接到终端,但我想以其他用户身份连接。这可能吗?
您可以在 Dockerfile 中指定 USER
。所有后续操作都将使用该帐户执行。如果您只想在启动容器时使用该用户(而不是在构建图像时),则可以在 CMD
或 ENTRYPOINT
之前指定 USER
一行。当您从生成的图像启动容器时,您将作为指定用户附加。
对于docker run
:
只需在启动docker容器时添加选项--user <user>
即可更改为其他用户。
docker run -it --user nobody busybox
对于docker attach
或docker exec
:
由于该命令用于attach/execute进入现有进程,因此它直接使用那里的当前用户。
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)
如果你真的想依附于你想要拥有的用户,那么
- 从该用户开始
run --user <user>
或在您的 Dockerfile
中使用 USER
提及它
- 使用 `su 更改用户
您可以 运行 shell 在 运行ning docker 容器中使用如下命令:
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
。
我正在使用此工作流来允许我的开发团队为 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
机制允许用户拥有由构建创建的任何 files/directories。
虽然这对我们有用。这似乎有点老套。我对其他实现持开放态度...
以 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
作为 2020 年的更新答案。--user,-u 选项是用户名或 UID(格式:[:])。
然后,它像这样对我有用,
docker exec -it -u root:root container /bin/bash
参考:https://docs.docker.com/engine/reference/commandline/exec/
这解决了我的用例:“使用 WSL2 在 Windows 运行 Docker 桌面上的 nodejs 容器中编译 webpack 内容,并在您当前登录的用户下构建资产."
docker run -u 1000 -v "$PWD":/build -w /build node:10.23 /bin/sh -c 'npm install && npm run build'
基于 的回答。谢谢!
另外 this material 帮助我理解了正在发生的事情。
默认情况下 运行
docker run -it [myimage]
或
docker attach [mycontainer]
您以 root 用户身份连接到终端,但我想以其他用户身份连接。这可能吗?
您可以在 Dockerfile 中指定 USER
。所有后续操作都将使用该帐户执行。如果您只想在启动容器时使用该用户(而不是在构建图像时),则可以在 CMD
或 ENTRYPOINT
之前指定 USER
一行。当您从生成的图像启动容器时,您将作为指定用户附加。
对于docker run
:
只需在启动docker容器时添加选项--user <user>
即可更改为其他用户。
docker run -it --user nobody busybox
对于docker attach
或docker exec
:
由于该命令用于attach/execute进入现有进程,因此它直接使用那里的当前用户。
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)
如果你真的想依附于你想要拥有的用户,那么
- 从该用户开始
run --user <user>
或在您的Dockerfile
中使用USER
提及它
- 使用 `su 更改用户
您可以 运行 shell 在 运行ning docker 容器中使用如下命令:
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
。
我正在使用此工作流来允许我的开发团队为 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
机制允许用户拥有由构建创建的任何 files/directories。
虽然这对我们有用。这似乎有点老套。我对其他实现持开放态度...
以 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
作为 2020 年的更新答案。--user,-u 选项是用户名或 UID(格式:
然后,它像这样对我有用,
docker exec -it -u root:root container /bin/bash
参考:https://docs.docker.com/engine/reference/commandline/exec/
这解决了我的用例:“使用 WSL2 在 Windows 运行 Docker 桌面上的 nodejs 容器中编译 webpack 内容,并在您当前登录的用户下构建资产."
docker run -u 1000 -v "$PWD":/build -w /build node:10.23 /bin/sh -c 'npm install && npm run build'
基于
另外 this material 帮助我理解了正在发生的事情。