在docker中,将文件作为非根文件写入装载的文件系统?

在docker中,将文件作为非根文件写入装载的文件系统?,docker,Docker,我有一个docker容器,带有-v/home/dan:/home/dan:rw。当容器将文件写入/home/dan时,这些文件由主机文件系统中的root用户拥有。有没有办法使从容器写入已装入卷的文件归主机文件系统上的某个任意用户所有?编辑:自从我最初的回答说无法这样做以来,情况发生了变化。根据以下各方的答复: 这可以通过使用docker run命令的-u开关来完成 例如: docker run -v /home/dan:/home/dan -u `id -u $USER` IMAGE 这是可能

我有一个docker容器,带有-v/home/dan:/home/dan:rw。当容器将文件写入/home/dan时,这些文件由主机文件系统中的root用户拥有。有没有办法使从容器写入已装入卷的文件归主机文件系统上的某个任意用户所有?

编辑:自从我最初的回答说无法这样做以来,情况发生了变化。根据以下各方的答复:

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

例如:

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

这是可能的。很难实现自动化,但这是可能的。过程如下:

  • 在主机中,确定当前用户id和组id
  • 在docker容器中,运行shell脚本以:

    • 从主机添加具有组id的新组
    • 从主机添加具有相同用户id的新用户(并且属于刚刚创建的组)
    • sudo作为这个新用户
  • 现在,容器中生成的每个文件都将使用正确的用户id和组id,主机将它们附加到您的用户

    我已经编写了一个工具来使用make实现自动化,它被称为。希望这能有所帮助。

    如前所述,用户id可以使用

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

    例如:

    docker run -v /home/dan:/home/dan -u `id -u $USER` IMAGE
    
    回答的后续内容-我想说,包括用户组也很好,否则您将得到属于
    user:user
    group:root
    的内容。要获得
    user:user
    也只需传入组id,例如:

    docker run -v /home/dan:/home/dan -u `id -u $USER` IMAGE
    
    docker run-v/home/dan:/home/dan-u`id-u$USER`:`id-g$USER`IMAGE
    #如果是针对当前用户,那么可以省略$user env变量
    docker run-v/home/dan:/home/dan-u`id-u`:`id-g`IMAGE
    
    查看mandark的答案,这是现在的正确答案(可能是因为它最初发布后发生了更改),您如何处理docker容器现在以非根模式运行的事实?这似乎是一个巨大的不便处理,而发展。不知道我是否理解。当您在没有docker的情况下开发时,我认为您使用的是非root用户,对吗?请详细说明。您必须指定不可移植的uid/gid(用户/组),以便文件权限与本地src装载匹配。是否使用dev uid/gid创建用户,然后在docket env中安装该用户下的所有依赖项,然后在集群环境中部署时将该用户设置为默认用户?默认情况下,大多数docker映像都在容器中配置了root。@DavidParks可能我假设的太多了,所以请纠正我-但看起来您有两个不同的用例。在一种情况下,您希望能够更改环境,即安装依赖项-在另一种情况下,您希望以有限的权限运行特定进程。我将使用root维护映像,一旦拥有所有libs/依赖项,提交容器,标记映像并使用特定的用户id/组id。