我已经从官方 apt 存储库安装了 Docker CE。为了授予普通用户访问 Docker 的权限,我创建了一个组docker
并将每个用户添加到该组。但是,每当任何用户在容器内运行某些内容时(docker run -d ...
),进程都会在我的 UID 下运行,并且他们创建的文件拥有我的所有权,例如myuser:myuser
而不是anotheruser:anotheruser
。当用户明确指定其 UID(docker run -d --user $UID ...
)时,进程会使用其 UID 正确注册,但输出属于anotheruser:root
。该组规范(即root
)让我很麻烦。我该怎么办:
- 让其他用户仅在其 UID 下运行 docker;
- 使其输出寄存器为
anotheruser:anotheruser
或anotheruser:docker
。
答案1
Docker 容器由 docker 守护程序运行,该守护程序以 root 身份运行。默认情况下,docker 守护程序以 root 身份运行容器。使用docker run --user={uid}:{gid}
,可以告诉守护程序以特定用户和有效组身份运行容器。
将系统用户添加到该docker
组可让他们拥有与 docker 守护进程交互的权限。这包括以 root 身份启动容器。因此,添加到该docker
组的任何用户都必须是可信的。
请注意,docker
组用户可以将主机挂载/
到容器内,从而拥有对整个主机文件系统的 root 访问权限。因此需要信任。
简而言之,答案是“如何让用户始终以自己的用户 ID 运行 docker 容器”是:要求他们这样做。告诉他们总是调用docker run
:
docker run --user=$(id -u):$(id -g) ...
包括uid
并gid
解决了您的第二个问题。注意:也可以在定义图像的 DockerFile 中指定 USER,但随后命名容器内定义的 uid。
答案2
Docker 在系统范围内运行,而不是在特定用户上运行。这意味着任何用户docker run
都将以 root 身份使用 docker 服务运行。
如果您在 Docker 中看到您的 ID,这可能是因为您的 ID 为 1000,这是第一个用户 ID。许多 Docker 使用特定帐户运行自己的服务,该帐户可能大多数时候使用相同的 ID。