如何从 docker-compose.yml 更改 docker-compose.yml 中已安装卷的权限?

Posted

技术标签:

【中文标题】如何从 docker-compose.yml 更改 docker-compose.yml 中已安装卷的权限?【英文标题】:How can I change permission of mounted volumes in docker-compose.yml from the docker-compose.yml? 【发布时间】:2018-10-23 19:53:47 【问题描述】:
version: '2'
services:
    web:
        build:
            context: ./
            dockerfile: deploy/web.docker
        volumes:
            - ./:/var/www
        ports:
            - "8080:80"
        links:
            - app

docker-compose up -d --build 时如何自动更改权限 (chmod) /var/www?

【问题讨论】:

【参考方案1】:

其实这有点复杂,需要更清晰一些。

如果我们将主机文件夹 folder_a 挂载到来宾文件夹 folder_b 并且 folder_b 已经创建,“chown”-ed 和“chmod "-ed 在创建容器映像 (Dockerfile) 时,从来宾角度来看,folder_b 定义的权限必须优先。这就是我的盒子上发生的事情。由于来宾用户不应该存在于主机中,因此“向主机添加权限”这样的答案不是很漂亮,它的意思是“给每个人写权限”。

如果 folder_b 尚未“准备好”预先安装,但它是“即时”安装的;我还没有找到任何方法来根据上下文更改权限。试图大声推理:主机上的 docker 守护进程对来宾用户一无所知。我也很好奇 chmod/chown 在技术上是否可以作为 docker 的进化版使用来宾姓名。我最初的期望是动态挂载继承父文件夹权限(如果 /mnt/a 由 app_user 拥有,那么在 /mnt/a/myMount 中挂载也会保留 app_user 对子文件夹的所有权,但是,新的在我的测试中,挂载的文件夹归 root 所有)

从安全角度来看,操作挂载的来宾不应将自己的安全/敏感文件夹挂载给来宾。通常假设如果您将卷提供给来宾,来宾必须能够对其执行任何操作。然而,“即时”挂载会在来宾内部产生一个“根”拥有的文件夹,因为根是来宾和主机都知道的唯一用户。

【讨论】:

【参考方案2】:

当从容器中的主机绑定挂载目录时,文件和目录保持它们在主机上的权限。这是设计使然:当使用绑定挂载时,您将授予容器从主机访问现有文件的权限,而 Docker 不会对这些文件进行修改;这样做会非常危险(例如,绑定挂载您的主目录会更改主机主目录的文件权限,可能导致您的计算机不再可用)。

要更改这些文件的权限,请更改它们在主机上的权限。

您可以在我在 *** 上发布的另一个答案中找到更多信息:https://***.com/a/29251160/1811501

【讨论】:

Dude...这正是 Docker 当前对我所做的...它更改了权限并且路径只能由 root 或 docker 容器用户访问...其余的应用程序不能不再使用该目录。我正在寻找一种设置权限的方法,以便我可以将权限设置回我想要在更改之前拥有的权限......这非常烦人并且会破坏东西!【参考方案3】:

您可以在额外的列之后添加权限,例如:

volumes:
        - ./:/var/www:ro //read only

【讨论】:

假设我想要 777 或 750 类似的权限 ro 会是什么? 查看en.wikipedia.org/wiki/Chmod,尤其是@Numerical 权限 等一下,要更改挂载卷的文件和文件夹的权限吗?我错过了你的问题,因为你只能在主机上做到这一点 只记得删除“//只读”部分,否则你会在构建时遇到关于“无效模式”的混乱错误

以上是关于如何从 docker-compose.yml 更改 docker-compose.yml 中已安装卷的权限?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS Elastic Container Service 中使用现有的 docker-compose.yml 文件?

如何验证我的 docker-compose.yml?

如何在 docker-compose.yml 中重建 docker 容器?

如何正确组合这个 docker-compose.yml?

如何在 docker-compose.yml 中开始测试之前等待数据库迁移完成

如何将docker-compose.yml转换为Dockerfile