【问题标题】:What permissions do I need to enable for Docker volumes to work?我需要启用哪些权限才能使 Docker 卷正常工作?
【发布时间】:2015-11-04 11:32:29
【问题描述】:
假设我有一个包含一些数据的 Docker 容器。我希望这些数据持续存在 - 如果容器停止、删除、升级等。我仍然希望数据位于主机操作系统文件系统上的可访问位置。
目前,我的解决方案是在我的主机(我使用 Ubuntu 14.10)上创建一个目录 /srv/service-name,然后使用 -v /srv/service-name:/path/inside/container 参数运行我的服务。
通过反复试验,我发现有时容器无法写入此内容,因为它没有正确的权限。我发现this question 提供了纯数据容器作为解决方案。好吧,我不想使用容器,因为我正在做的事情似乎不必要地复杂。我宁愿继续使用-v 挂载目录。
那么,如何在我要挂载的目录上设置正确的权限?
【问题讨论】:
标签:
ubuntu
permissions
docker
【解决方案1】:
那么,如何在我要挂载的目录上设置正确的权限?
Docker 卷没有什么特别之处:为了让进程写入目录,该目录的所有权和权限需要允许写入。
默认情况下,Docker 容器中的进程以root 运行,并且几乎可以在任何地方进行写入,没有像 selinux 这样的额外限制。
如果容器中的进程不是以 root 身份运行,则由您来确保您向容器公开的任何卷都具有适当的所有权。你基本上有两种选择:
-
从主机设置源目录的权限。
如果您的进程在容器内以用户 httpd 的身份运行,您将需要确定与该用户关联的数字 UID,然后将目录 chown 确定为适当的用户 ID。例如,如果容器内的用户 httpd 是 UID 48,那么在主机上:
chown 48 /srv/webserver
如您所料,这意味着在主机上运行 ls -l 可能会返回不同的用户名,因为无法保证容器中的 UID 与主机上的 UID 匹配。
-
在ENTRYPOINT 脚本中设置权限
如果您正在构建自己的镜像,您可以以root 的身份运行容器,然后使用ENTRYPOINT 脚本负责 (a) 设置所有权和权限,然后 (b) 切换到非特权用户运行您的CMD。