在Docker中,以非root用户身份将文件写入挂载的文件系统?

36

我有一个带有-v /home/dan:/home/dan:rw的docker容器。当容器写入文件到/home/dan时,主机文件系统中的文件所有者是root。有没有办法让从容器写入到挂载卷中的文件在主机文件系统上由一些任意用户拥有?

4个回答

24

正如François Zaninotto所指出的,用户ID可以被使用。

这可以通过在docker run命令中使用-u开关来完成。

例如:

docker run -v /home/dan:/home/dan -u `id -u $USER` IMAGE

1
你如何处理 Docker 容器现在以非 root 模式运行的事实?这似乎是在开发过程中需要处理的一个巨大不便。 - David Parks
不确定我是否理解。当您没有使用Docker进行开发时,我想您是在使用非root用户,对吗?请详细说明。 - mandark
你必须指定一个不可移植的uid/gid(用户/组),以便文件权限与本地src挂载匹配。您是否创建一个使用您的开发者uid/gid的用户,然后在docker环境中安装所有依赖项,并将该用户设置为在集群环境中部署时的默认用户?默认情况下,大多数Docker镜像都配置为容器中的root用户。 - David Parks
1
@DavidParks 也许我假设得太多了,请纠正我——但看起来你有两种不同的用例。在一种情况下,你想要能够更改环境,即安装依赖项;在另一种情况下,你想要使用受限权限运行特定进程。我会使用 root 维护镜像,一旦拥有所有的库/依赖项,就提交容器、标记镜像,并使用特定的用户 ID / 组 ID。 - mandark

17

对于mandark的回答,我想补充一点,即最好还要包括用户组,否则您将会得到属于user: USERgroup: root的内容。要实现user:user,只需同时传递组ID,例如:

docker run -v /home/dan:/home/dan -u `id -u $USER`:`id -g $USER` IMAGE

# if it's for the current user, then you can omit the $USER env var

docker run -v /home/dan:/home/dan -u `id -u`:`id -g` IMAGE

17

编辑:自从我最初回答时情况发生了改变,我的回答是无法完成。根据Mandark的回答:

可以通过在docker run命令中使用-u开关来完成。

例如:

docker run -v /home/dan:/home/dan -u `id -u $USER` IMAGE

2
看看mandark的回答,那是正确的答案(也许自原帖发布以来已经更改)。 - rgardler

4
可能。自动化很难,但是可以实现。以下是步骤:
  1. 在主机上确定当前用户ID和组ID
  2. 在Docker容器中运行一个shell脚本来:

    • 添加一个使用主机组ID的新组
    • 添加一个使用主机相同用户ID(并属于刚创建的组)的新用户
    • 将其sudo为这个新用户

现在,容器内生成的每个文件都将使用正确的用户ID和组ID,并且主机将将它们附加到您的用户。

我编写了一个使用make自动化的工具来实现这一点,叫做make-docker-command。希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接