Mac 与 Linux 上的 Docker 挂载权限

Nik*_*kar 4 linux macos elasticsearch docker

我试图使用 docker 运行elasticsearch。并希望使用卷来保存数据。这是我使用的命令。

docker run -it --rm -v $(pwd)/elasticdata:/usr/share/elasticsearch/data elasticsearch:7.5.1
Run Code Online (Sandbox Code Playgroud)

这在我的 Mac 上运行良好。但是当我尝试在 Travis CI 中运行它时,它失败了,权限被拒绝/usr/share/elasticsearch/data/目录权限被拒绝。

这是我注意到 OSX 与 Linux 上 docker 卷的权限不一致的情况

OSX (Docker 版本 19.03.8,构建 afacb8b)

$ ls -l elasticdata/.keepme
-rw-r--r--  1 nikhil  staff  0 Apr  3 13:07 elasticdata/.keepme

$ docker run -it --rm -v $(pwd)/elasticdata:/usr/share/elasticsearch/data elasticsearch:7.5.1 namei -l /usr/share/elasticsearch/data/.keepme
f: /usr/share/elasticsearch/data/.keepme
drwxr-xr-x root          root /
drwxr-xr-x root          root usr
drwxr-xr-x root          root share
drwxrwxr-x elasticsearch root elasticsearch
drwxr-xr-x root          root data
-rw-r--r-- root          root .keepme <---------------- owned by root!
Run Code Online (Sandbox Code Playgroud)

Ubuntu (Docker 版本 18.06.1-ce,内部版本 e68fc7a)

$ namei -l elasticdata/.keepme
f: elasticdata/.keepme
drwxrwxr-x nowalekar nowalekar elasticdata
-rw-rw-r-- nowalekar nowalekar .keepme

$ docker run -it --rm -v $(pwd)/elasticdata:/usr/share/elasticsearch/data elasticsearch:7.5.1 namei -l /usr/share/elasticsearch/data/.keepme
f: /usr/share/elasticsearch/data/.keepme
drwxr-xr-x root          root /
drwxr-xr-x root          root usr
drwxr-xr-x root          root share
drwxrwxr-x elasticsearch root elasticsearch
drwxrwxr-x 1013          1013 data
-rw-rw-r-- 1013          1013 .keepme
Run Code Online (Sandbox Code Playgroud)

这种不一致是预期的吗?

我是否点击了这个:http://turnoff.us/geek/before-devops-after-devops/

BMi*_*tch 7

是的,这是预期的。Osxfs自动将容器文件所有权映射到主机的所有权,以获得更轻松的开发体验。通常,主机卷会将主机的 uid/gid 直接传递到容器中,而不进行任何转换(除非您使用用户命名空间,但这通常会增加此问题而不是解决它)。因此,如果该目录由主机上的 uid 1003 拥有,则这就是文件在容器中将具有的 uid。

主机卷隐式不可移植,它们取决于主机的状态。为了可移植性,请切换到由​​ docker 管理的命名卷。它们在首次创建时包含一个初始化步骤,该步骤往往可以解决权限问题。