docker非根绑定挂载权限,WITH –userns-remap

所有:徘徊尝试获取绑定安装权限的工作。

我的目标是绑定在一个容器中安装一个卷,以便:

  • (a)容器不以root用户身份运行入口点
  • (b)docker-daemonconfiguration了–userns-remap,以便容器在主机上没有root
  • (c)我可以使用一个容器来绑定安装和读取/写入我的普通用户(主机上的UID:GID 1000)可读写的卷
  • (d)创build文件时,它们都具有作为常规主机用户的权限,而不是root或nobody。

从安全的angular度来看,我们希望避免在主机上有容器的容器,这是一个不容忽视的要求(b)。 需求a,c和d来自将容器日志发送到文件系统上的绑定安装目录的愿望,因此可以通过splunk来消化它们。 这个configuration是/将会是在kubernetes上进行日志logging的首选方式( 在这里可以看到更多的细节)。

有没有人有办法获得以上所有4个要求?

这是查看问题的最简单的方法。 用–userns-remap运行Docker:

DOCKER_OPTS="--userns-remap=1000:1000" 

开始容器高山,运行它作为根。 观察foo.txt的权限是没有人的。 我预计他们是根或1000:1000,因为那是什么他们在文件系统上:

 dcowden@ubuntu:~/gitwork/file-perm-stuff$ docker run --rm -it -v /home/dcowden/gitwork/file-perm-stuff/testlogs:/logs alpine /bin/sh / # ls -ln /logs total 0 -rw-rw-r-- 1 65534 65534 0 Aug 20 19:08 foo.txt / # exit 

退出容器,并查看文件。 观察他们拥有1000:1000,所以用户重新映射已经搞砸了:

 dcowden@ubuntu:~/gitwork/file-perm-stuff$ ls -ln testlogs total 0 -rw-rw-r-- 1 1000 1000 0 Aug 20 15:08 foo.txt dcowden@ubuntu:~/gitwork/file-perm-stuff$ ls -ln . total 8 -rw-rw-r-- 1 1000 1000 248 Aug 20 16:07 Dockerfile drwxrwxr-x 2 1000 1000 4096 Aug 20 16:09 testlogs 

一个更复杂的Dockerfile,试图创build一个非特许的容器用户也失败了,虽然这很清楚,因为它已经不能用于root。 它不像2的dynamic解决scheme那样复杂,但仍然失败:

 FROM alpine:3.4 ENV USER_ID=1000 ENV USER_NAME="appuser" RUN addgroup -g $USER_ID -S $USER_NAME RUN adduser -u $USER_ID -S -G $USER_NAME $USER_NAME RUN mkdir /logs && chown $USER_NAME:$USER_NAME /logs VOLUME /logs WORKDIR /logs USER $USER_NAME 

我知道这个类似的问题 ,但没有提供答案。 实际上,简单地使用–userns-remap = 1000:1000会生成一个合适的/ etc / subuidconfiguration,而不需要任何手动编辑,但仍然不能用于bind安装。

我也知道这个答案 , 这也是一个,但我似乎已经匹配的userids都build议,没有一个合适的结果。

我遵循这里的指示,并且我实现了一个满足所有要求的设置,除了(b)以外 – 当我不使用userns-remap

当我把这一行添加到DOCKER_OPTS(启用userns-remap)时:

–userns重新映射= 1000:1000

然后,整个事情就停止了,我似乎没有任何工作。 绑定安装卷看起来是由任何人拥有的。 我试过以下的东西,其中没有任何影响:

  1. 将Z选项添加到卷映射的末尾
  2. 在主机上运行这个命令:'chcon -Rt svirt_sandbox_file_t / path / to / volume'(从这里

我的猜测是,由于我同时告诉docker将容器根用户映射到我的UID(1000),并且还显式创build了具有相同UID:GUID的另一个用户,所以出现了问题。 这应该很好 – 在容器中,root是0:0,我也创build了UID:GUI 1000:1000。 当创build文件时,root和non-root都应该创build所有权为1000:1000的文件。 当以非root和root身份运行镜像时,事实上是这样的。

试图写入绑定安装的卷时,所有内容都会失败。

这是我的设置:

Docker 1.12 Ubuntu 14.04 unpriveliged UID:主机上的GID:1000:1000

Docker信息:

 Containers: 1 Running: 0 Paused: 0 Stopped: 1 Images: 41 Server Version: 1.12.1 Storage Driver: aufs Root Dir: /var/lib/docker/100000.100000/aufs Backing Filesystem: extfs Dirs: 25 Dirperm1 Supported: false Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: host null bridge overlay Swarm: inactive Runtimes: runc Default Runtime: runc Security Options: apparmor Kernel Version: 3.13.0-83-generic Operating System: Ubuntu 14.04.4 LTS OSType: linux Architecture: x86_64 CPUs: 1 Total Memory: 7.785 GiB Name: ubuntu ID: 2OO6:ESDJ:WGQ2:UGEQ:5ULF:MXNY:E5XC:WWWN:KJGJ:X2GT:I6VV:V2DN Docker Root Dir: /var/lib/docker/100000.100000 Debug Mode (client): false Debug Mode (server): false Username: dcowden Registry: https://index.docker.io/v1/ WARNING: No swap limit support Insecure Registries: 127.0.0.0/8