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


84

运行时默认

docker run -it [myimage]

要么

docker attach [mycontainer]

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


3
是。docker run --user user_name
熊冰进

1
没有此类附加选项。您必须先以root身份登录,然后su user_name
Xiongbing Jin

Answers:


93

对于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>或在您的Dockerfile使用中提及它USER
  2. 使用`su更改用户

72

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

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


2
root是默认用户。--user我想必须以root身份运行命令时,可以省略该选项。
斯潘妮

8
@Stphane并非总是如此,因为可以通过指令在Dockerfile中自定义默认用户USER,请参阅docs.docker.com/engine/reference/builder/#user
ryenus

5

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


同样也不要忘记设置HOME
karthik101 '18

2

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

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

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


并非“按原样”工作,而是让我找到了可行的解决方案。谢谢!
JosefSábl20年

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容器内部。

我正在使用此工作流,以允许我的开发团队为我维护其bsp的arm64目标交叉编译C / C ++代码(其中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机制允许用户拥有由构建创建的任何文件/目录的所有权。

虽然这对我们有用。似乎有点不客气。我愿意接受其他实现方式...



0

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

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

.env

UID=1000


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'

基于本征菲尔德的答案。谢谢!

此外,材料还帮助我了解发生了什么。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.