如何让 Docker 容器中的非 root 用户访问安装在主机上的卷

新手上路,请多包涵

我以非 root 用户身份在 Docker 容器中运行我的应用程序。我这样做是因为它是最佳实践之一。但是,在运行容器时,我将主机卷安装到它 -v /some/folder:/some/folder 。我这样做是因为我在 docker 容器内运行的应用程序需要将文件写入挂载的主机文件夹。但是由于我以非 root 用户身份运行我的应用程序,因此它无权写入该文件夹

问题

是否可以让 docker 容器中的非 root 用户访问托管卷?

如果没有,我唯一的选择是在 docker 容器中以 root 身份运行该进程吗?

原文由 Anthony 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 828
2 个回答

这里没有神奇的解决方案:docker 内部的权限管理与没有 docker 的权限相同。您需要运行相应的 chownchmod 命令来更改目录的权限。

一种解决方案是让您的容器以 root 身份运行并使用 ENTRYPOINT 脚本进行适当的权限更改,然后您的 CMD 作为非特权用户。例如,将以下内容放入 entrypoint.sh

 #!/bin/sh

chown -R appuser:appgroup /path/to/volume
exec runuser -u appuser "$@"

这假设您有可用的 runuser 命令。您可以使用 sudo 来完成几乎相同的事情。

通过在 Dockerfile 中包含 ENTRYPOINT 指令来使用上述脚本:

 FROM baseimage

COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/bin/sh", "entrypoint.sh"]
CMD ["/usr/bin/myapp"]

这将启动容器:

 /bin/sh entrypoint.sh /usr/bin/myapp

入口点脚本将进行所需的权限更改,然后运行 /usr/bin/myapp as appuser

原文由 larsks 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果主机环境没有 appuserappgroup 会抛出错误,所以最好使用用户 ID 而不是用户名:

在你的容器内,运行

appuser$ id

这将显示:

uid=1000(appuser) gid=1000(appuser) 组=1000(appuser)

从主机环境,运行:

 mkdir -p /some/folder
chown -R 1000:1000 /some/folder
docker run -v /some/folder:/some/folder [your_container]

在你的容器里,检查

ls -lh

要查看用户和组名,如果不是 root ,那么它应该可以工作。

原文由 James Yang 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进