这两个 docker 版本之间有什么变化来更改卷权限?

What changed between these two docker versions to change volume permissions?

我有一个 docker-compose.yml 看起来像这样:

version: '2'
services:
  foo:
    image: node:11
    volumes:
      - ".:/usr/src"
    working_dir: "/usr/src"
# ...

在我的 mac 上,我有 Docker 18.09。在我们的詹金斯构建服务器上,我有 Docker 1.10.

如果我 运行 两个 machines

以下
docker-compose run foo mkdir hello

在 mac 上,它创建了一个拥有我用户所有权的文件夹,在构建服务器上,它创建了一个拥有 root 用户所有权的文件夹。如果我 运行 ls -l 每个:

ls -l # After folder created with Docker 18.09 on Mac
...
drwxr-xr-x   2 my_user       my_group      64 Dec 19 00:10 hello
...

ls -l # After folder created with Docker 1.10 on Jenkins machine
...
drwxr-xr-x   2 root          root          64 Dec 19 00:10 hello
...

我了解在早期版本中,该目录是使用 docker 的 root 帐户创建的,并被授予 uidgid 的权限 0 .我不明白的是为什么更现代的版本不再发生这种情况。

我已经 tried/discounted 解决了一些问题:

我在网上看到很多示例建议将撰写中的 user 字段设置为主机 machine 上的用户 ID。不幸的是,这导致了某些脚本的权限问题,这些脚本似乎希望 运行 以 root 身份运行并且不是特别可移植。

此外,很遗憾,我们暂时无法在本地 machine 上升级 Docker 的版本,因此解决方案需要适用于 v 1.10,并且对 docker 引擎的其他用户的影响尽可能小(我认为这会使用户命名空间变得更加困难,但我并不完全理解它们,所以我可能会弄错)。

我的问题是,Docker 的两个版本之间发生了什么变化来改变这种行为,我可以做些什么来使早期的行为像后来的那样?创建的文件和目录应该被授予主机用户的所有权,而不是 root 的。

对于 MacOS,您有 osxfs,它以对用户安装卷相对透明的方式映射文件权限:

https://docs.docker.com/docker-for-mac/osxfs/

直接在 Linux 上,卷在容器和主机中使用相同的 uid/gid 安装。如果您 运行 应用程序作为容器内的不同用户,我的解决方案是以 root 身份启动容器,修改容器用户以匹配卷装载权限,然后 su 到该用户 运行应用程序。执行此操作的脚本和完整示例位于:

https://github.com/sudo-bmitch/docker-base

如果您 运行 您的应用程序作为容器中的 root 用户,那么它将在 Linux 上的卷中作为 root 用户创建文件。我不知道有任何简单的解决方法。