我有一个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
帐户创建的,并且被授予uid
和gid
为0的权限。我不了解的是为什么在更现代的版本中不再发生这种情况。
我已经尝试过/折扣了一些解决方法:
我在网上看到了很多示例,这些示例建议将compose中的user
字段设置为主机上用户的ID。不幸的是,这会导致某些脚本的权限问题,这些脚本似乎期望以root身份运行,并且不是特别可移植。
此外,不幸的是,我们暂时无法在本地计算机上升级Docker的版本,因此该解决方案需要适用于1.10版,并且对Docker引擎的其他用户几乎没有影响尽可能(我认为这会使用户命名空间有点困难,但我不太了解它们,所以我可能会误会)。
我的问题是,在两个版本的Docker之间进行了哪些更改以更改此行为,并且我可以做些什么来使较早的行为与稍后的行为相同?创建的文件和目录应被赋予主机用户的所有权,而不是root用户的所有权。
答案 0 :(得分:1)
在MacOS中,您拥有osxfs,它以对用户安装卷相对透明的方式映射文件权限:
https://docs.docker.com/docker-for-mac/osxfs/
直接在Linux上,使用相同的uid / gid在容器和主机中装入卷。如果您以容器内的其他用户身份运行应用程序,我的解决方案是以根用户身份启动容器,修改容器用户以匹配卷安装权限,然后使用该用户运行该应用程序。有关此操作的脚本和完整示例,请参见:
https://github.com/sudo-bmitch/docker-base
如果在容器中以根用户身份运行应用程序,则它将在Linux上以根用户身份创建文件。我不知道有任何简单的解决方法。