以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
您可以使用以下命令在正在运行的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'