我使用Docker已经有一段时间了,在处理持久数据时不断发现同样的问题。
我创建Dockerfile并公开一个卷或使用——volumes-from在容器中挂载一个主机文件夹。
主机上的共享卷需要申请哪些权限?
我可以想到两个选择:
So far I've given everyone read/write access, so I can write to the folder from the Docker container.
Map the users from host into the container, so I can assign more granular permissions. Not sure this is possible though and haven't found much about it. So far, all I can do is run the container as some user: docker run -i -t -user="myuser" postgres, but this user has a different UID than my host myuser, so permissions do not work. Also, I'm unsure if mapping the users will pose some security risks.
还有其他选择吗?
你们是如何处理这个问题的?
要在docker主机和docker容器之间共享文件夹,请尝试以下命令
$(pwd):$(pwd)-i -t ubuntu
-v标志将当前工作目录挂载到容器中。当绑定挂载卷的主机目录不存在时,Docker会自动在主机上为你创建这个目录,
然而,这里有两个问题:
如果您不是root用户,则无法对挂载的卷进行写操作,因为共享文件将由主机中的其他用户拥有。
你不应该以root用户在容器中运行进程,但即使你以硬编码用户运行,它仍然不会与你笔记本电脑上的用户匹配。
解决方案:
容器:
创建一个用户testuser,默认用户id从1000开始,
主持人:
创建一个名为“testgroup”的组,组id为1000,并将目录更改为新组(testgroup . testgroup . testgroup)
为了保护和更改docker容器和docker主机的根,请尝试使用——uidmap和——private-uids选项
https://github.com/docker/docker/pull/4572#issuecomment-38400893
此外,您还可以删除docker容器中的几个功能(——cap-drop)以确保安全性
http://opensource.com/business/14/9/security-for-docker
更新支持应该出现在docker > 1.7.0中
更新版本1.10.0 (2016-02-04)add——users -remap标志
https://github.com/docker/docker/blob/master/CHANGELOG.md#security-2
要在docker主机和docker容器之间共享文件夹,请尝试以下命令
$(pwd):$(pwd)-i -t ubuntu
-v标志将当前工作目录挂载到容器中。当绑定挂载卷的主机目录不存在时,Docker会自动在主机上为你创建这个目录,
然而,这里有两个问题:
如果您不是root用户,则无法对挂载的卷进行写操作,因为共享文件将由主机中的其他用户拥有。
你不应该以root用户在容器中运行进程,但即使你以硬编码用户运行,它仍然不会与你笔记本电脑上的用户匹配。
解决方案:
容器:
创建一个用户testuser,默认用户id从1000开始,
主持人:
创建一个名为“testgroup”的组,组id为1000,并将目录更改为新组(testgroup . testgroup . testgroup)
一个非常优雅的解决方案可以在官方的redis图像和一般的所有官方图像中看到。
详细描述:
首先创建redis用户/组
如Dockerfile评论所示:
首先添加我们的用户和组,以确保他们的id被一致分配,不管添加什么依赖项
使用Dockerfile安装gosu
Gosu是su / sudo的替代品,便于从根用户降级。(Redis总是与Redis用户一起运行)
配置/data卷,设置为workdir
通过使用volume /data命令配置/data卷,我们现在有了一个单独的卷,它可以是docker卷,也可以绑定挂载到主机目录。
将其配置为工作目录(workdir /data)将使其成为执行命令的默认目录。
添加docker-entrypoint文件,并将其设置为ENTRYPOINT,默认CMD redis-server
这意味着所有容器的执行都将通过docker-entrypoint脚本运行,默认情况下要运行的命令是redis-server。
docker-entrypoint是一个脚本,它做了一个简单的功能:改变当前目录(/data)的所有权,并从根用户降级到redis用户以运行redis-server。(如果执行的命令不是redis-server,则直接执行该命令。)
这有以下影响
如果/data目录被绑定挂载到主机上,docker-entrypoint将在redis用户下运行redis-server之前准备用户权限。
这使您可以轻松地在任何卷配置下运行容器,无需进行任何设置。
当然,如果您需要在不同映像之间共享卷,则需要确保它们使用相同的userid/groupid,否则最新的容器将劫持前一个容器的用户权限。