all:试图让bind-mount权限正常工作。
我的目标是将卷装入容器中,以便:
从安全角度来看,我们希望避免在主机上具有root权限的容器 - 这是一种明智的 - 这是(b)的要求。要求a,c和d来自将容器日志发送到文件系统上的绑定挂载目录的愿望,因此它们可以被splunk消化。此配置是/将成为登录kubernetes的首选方法(有关详细信息,请参阅here)。
有没有人有办法获得上述所有4项要求?
这是查看问题的最简单方法。使用--userns-remap运行Docker:
DOCKER_OPTS="--userns-remap=1000:1000"
启动容器高山,以root身份运行。观察foo.txt的权限是没人的。我expec他们是root或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,尝试创建一个非托管容器的用户也会失败,尽管这很清楚,因为它已经不能用于root了。它没有2的动态解决方案那么复杂,但它仍然失败:
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
我知道this similar question,但它没有提供答案。事实上,只需使用--userns-remap = 1000:1000即可生成合适的/ etc / subuid配置,无需任何手动编辑,但仍无法使用绑定装载。
我也知道this answer和this one too,但我似乎与两者都提供了匹配,但没有合适的结果。
我按照here的说明操作,我实现了一个满足除上述(b)之外的所有要求的设置 - 它在我不使用userns-remap时效果很好
当我将此行添加到DOCKER_OPTS(启用userns-remap)时:
- userns-remap = 1000:1000
然后整件事停止工作,我所做的一切似乎都没有用。绑定安装的卷似乎由nobody拥有。我尝试了以下几件事,其中没有任何影响:
我的猜测是,由于我同时告诉docker将容器root用户映射到我的UID(1000),并且还显式创建具有相同UID:GUID的另一个用户,因此出现了问题。那个应该没问题 - 在容器中,root是0:0,我也创建了UID:GUI 1000:1000。创建文件时,root和root都应创建所有权为1000:1000的文件。当以非root用户和root用户身份运行映像时,实际上就是这种情况。
尝试写入装入装订的卷时,一切都失败了。
这是我的设置:
Docker 1.12 Ubuntu 14.04 Unprivileged 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