相关疑难解决方法(0)

Docker和--userns-remap,如何管理卷权限以在主机和容器之间共享数据?

在docker中,在容器内创建的文件在从主机检查时往往具有不可预测的所有权.默认情况下,卷上文件的所有者是root(uid 0),但只要非root用户帐户涉及容器并写入文件系统,所有者就会从主机角度变得或多或少随机.

当您需要使用调用docker命令的同一用户帐户从主机访问卷数据时,这是一个问题.

典型的解决方法是

  • 在Dockerfiles中创建时强制用户uID(非可移植)
  • 将主机用户的UID docker run作为环境变量传递给命令,然后chown在入口点脚本中的卷上运行某些命令.

这两种解决方案都可以控制容器外的实际权限.

我希望用户命名空间是这个问题的最终解决方案.我已经使用最近发布的版本1.10和--userns-remap设置到我的桌面帐户运行了一些测试.但是,我不确定它是否可以使安装卷上的文件所有权更容易处理,我担心它实际上可能正好相反.

假设我启动这个基本容器

docker run -ti -v /data debian:jessie /bin/bash
echo 'hello' > /data/test.txt
exit
Run Code Online (Sandbox Code Playgroud)

然后检查来自主机的内容:

ls -lh /var/lib/docker/100000.100000/volumes/<some-id>/_data/

-rw-r--r-- 1 100000 100000 6 Feb  8 19:43 test.txt
Run Code Online (Sandbox Code Playgroud)

这个数字'100000'是我的主机用户的子UID,但由于它与我的用户的UID不对应,我仍然无法在没有权限的情况下编辑test.txt.此子用户似乎与docker之外的实际常规用户没有任何关联.它没有映射回来.

由于UID->sub-UID名称空间中发生的映射,本文前面提到的由主机和容器之间的UID对齐组成的变通方法不再起作用.

那么,有没有办法在启用用户命名空间的情况下运行docker(为了提高安全性),同时仍然可以让运行docker的主机用户拥有在卷上生成的文件?

docker

79
推荐指数
2
解决办法
3万
查看次数

我可以在docker镜像中控制已装入装订的卷的所有者吗?

我有一个包含日食的码头图像.我在一个名为eclipse的帐户下运行图像中的eclipse.我想用我的工作区目录启动映像,将主机绑定到容器中.不幸的是,容器内安装的卷的所有者不是日食.安装的卷只保留主机的UID和GID.

有没有办法控制UID和GID是容器中安装的卷?

permissions docker

12
推荐指数
1
解决办法
5846
查看次数

除非具有777权限,否则Docker无法写入使用-v挂载的目录

我正在使用docker-solr图像和docker,我需要在其中安装一个目录,我使用该-v标志实现了该目录.

问题是容器需要写入我已挂载到其中的目录,但似乎没有权限这样做,除非我chmod 777在整个目录上执行此操作.我不认为设置允许所有用户读取和写入的权限是解决方案,但只是一个临时的解决方法.

任何人都可以指导我找到更规范的解决方案吗?

编辑:我一直在运行docker,sudo因为我将自己添加到了docker组.我刚刚发现问题解决了,如果我运行docker sudo,但我很好奇是否还有其他解决方案.

linux permissions docker

7
推荐指数
1
解决办法
4976
查看次数

docker非root用户绑定安装权限,带有--userns-remap

全部:尝试使绑定​​安装权限正常运行。

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

  • (a)容器未以root用户身份运行入口点
  • (b)docker-daemon配置了--userns-remap,因此容器在主机上没有根
  • (c)我可以使用容器绑定安装和读写普通用户可读写的卷(主机上的UID:GID 1000)
  • (d)创建文件时,它们都具有我的常规主机用户的权限,而不是root或没有权限。

从安全角度来看,我们要避免容器在主机上具有根目录(这很容易理解),这是要求(b)。需求a,c和d来自将容器日志发送到文件系统上绑定安装的目录的需求,因此它们可以被splunk消化。这种配置是/将是在kubernetes上进行日志记录的首选方法(有关此内容的更多信息,请参见 此处)。

有没有人能满足上述所有4个要求?

这是解决问题的最简单方法。使用--userns-remap运行Docker:

DOCKER_OPTS="--userns-remap=1000:1000"
Run Code Online (Sandbox Code Playgroud)

启动容器高山,以根用户身份运行它。观察foo.txt的权限是没有人。我认为它们是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
Run Code Online (Sandbox Code Playgroud)

退出容器,然后查看文件。观察它们是1000:1000拥有的,因此userns remap将它们搞砸了:

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 …
Run Code Online (Sandbox Code Playgroud)

linux ubuntu docker

6
推荐指数
0
解决办法
2584
查看次数

标签 统计

docker ×4

linux ×2

permissions ×2

ubuntu ×1