gpt4 book ai didi

docker - Docker 创建的卷文件的权限

转载 作者:行者123 更新时间:2023-12-02 00:52:33 26 4
gpt4 key购买 nike

好吧,我正在运行一个容器,它将创建/修改一些我需要在容器生命周期之外保留的文件。因此,我为此将一个文件夹分卷到容器中:

docker run -v $(pwd)/data:/app/data my-image

在第一次运行时,$(pwd)/data 不存在,所以 Docker 会为我创建它。但是,它将它创建为正在执行其自己的守护进程的用户,即 root。这是有问题的,因为容器内的用户显然不是 root

为了解决这个权限问题,我在主机中创建了一个用户组,其 ID 与容器中的用户相同,并授予他们访问 $(pwd)/data< 父文件夹的权限,并在文件夹上添加组权限设置(chmod g+s)。因此,如果我以 root 身份运行以下命令:

sudo mkdir whatver

文件夹 whatever 将可由该组修改,并可由容器的用户扩展。然而,当 Docker 创建文件夹 $(pwd)/data 时,它仍然被创建为属于 root 组,容器内的用户同样无法修改其中的数据.

现在,我已经通过在运行容器之前制作所需的文件夹来解决这个问题。然而,这是一个肮脏的解决方法,我正在寻找一个更清洁的解决方案。还有其他人遇到过这个问题吗?这是 Docker 不遵守父文件夹上的组权限设置的问题,还是我在这里遗漏了什么/做错了什么?

最佳答案

我不认为先创建文件夹是一种肮脏的解决方法,这对我来说是最佳做法。 Docker 正在为您运行绑定(bind)挂载,当源目录不存在时这将失败。为了方便用户,docker 会在你挂载主机时为你创建这个目录,而这个目录丢失了,但是没有必要使用这个功能,你会发现其他类型的挂载不会为你创建目录(例如--mount 群模式经常使用的语法)。

您可以以 root 身份启动您的容器,并使用入口点修复目录的权限,然后在最后运行类似 exec gosu app_user app_server 的命令以从 root 用户删除。我在 docker-base 的入口点执行此操作图像,这对于开发人员工作流很有用,在这种工作流中,开发人员通常需要动态更新容器以适应其主机环境。

否则,您可以切换到命名卷。这些将在它们是新的或为空时使用图像中的目录内容和权限进行初始化。当您需要持久性但不需要主机上的用户对卷内容进行直接文件系统访问时,它们是最佳实践。您将改为从装载该卷的容器内部访问命名卷。

关于docker - Docker 创建的卷文件的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56478109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com