在这两个Docker版本之间进行了哪些更改以更改卷权限?

时间:2018-12-19 06:50:38

标签: docker jenkins docker-compose docker-volume

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

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

在我的Mac上,我有Docker 18.09。在我们的jenkins构建服务器上,我有Docker 1.10。

如果我在两台计算机上都运行以下内容

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的权限。我不了解的是为什么在更现代的版本中不再发生这种情况。

我已经尝试过/折扣了一些解决方法:

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

此外,不幸的是,我们暂时无法在本地计算机上升级Docker的版本,因此该解决方案需要适用于1.10版,并且对Docker引擎的其他用户几乎没有影响尽可能(我认为这会使用户命名空间有点困难,但我不太了解它们,所以我可能会误会)。

我的问题是,在两个版本的Docker之间进行了哪些更改以更改此行为,并且我可以做些什么来使较早的行为与稍后的行为相同?创建的文件和目录应被赋予主机用户的所有权,而不是root用户的所有权。

1 个答案:

答案 0 :(得分:1)

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

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

直接在Linux上,使用相同的uid / gid在容器和主机中装入卷。如果您以容器内的其他用户身份运行应用程序,我的解决方案是以根用户身份启动容器,修改容器用户以匹配卷安装权限,然后使用该用户运行该应用程序。有关此操作的脚本和完整示例,请参见:

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

如果在容器中以根用户身份运行应用程序,则它将在Linux上以根用户身份创建文件。我不知道有任何简单的解决方法。