gpt4 book ai didi

docker - 在 Windows 主机上的 docker 容器内更改挂载文件夹中的文件权限

转载 作者:IT老高 更新时间:2023-10-28 21:42:11 25 4
gpt4 key购买 nike

免责声明/修改 2

几年后,对于阅读此问题的每个人 - 如果您在 Windows 上并希望将 docker 与 linux 容器一起使用,我强烈建议您根本不要在 windows 上使用 docker,而是完全在 VM 中启动整个 docker 环境。这个 Ext3 NTFS 问题会在很多不同的层面上让你感到头疼,以至于安装 docker-machine 甚至可能不值得。


编辑:

我正在使用 docker-machine它在 Virtualbox VM 内启动一个 boot2docker 实例,该实例在/c/Users 上有一个共享文件夹,您可以从中将卷挂载到容器中。所述卷的权限是问题所在。虚拟机存储在/c/Users/tom/.docker/下

我选择在 Hyper-V 上使用 docker-machine Virtualbox 工作流程,因为我在日常工作流程中需要 VBox,并且由于两者之间的不兼容,不可能在一个系统上同时运行 Hyper-V 和 Virtualbox不同的管理程序。

原始问题

我目前正在尝试在 Windows 上的容器中设置 PHPMyAdmin,但我无法更改 config.inc.php 文件的权限。

我发现:Cannot call chown inside Docker container (Docker for Windows)并认为这可能有点相关,但它似乎只适用于 MongoDB。

这是我的 docker-compose.yml

    version: "3"

services:
pma:
image: (secrect company registry)/phpmyadmin
ports:
- 9090:80
volumes:
- /c/Users/tom/projects/myproject/data/var/www/public/config.inc.php:/var/www/public/config.inc.php

现在,当我 docker exec -it [container] bash 并更改挂载目录时,我尝试在 config.inc 上运行 chmod。 php 但由于某种原因,它默默地失败了。

root@22a4bag43245: ls -la config.inc.php
-rw------- 1 root root 0 Aug 11 15:11 config.inc.php
root@22a4bag43245: chmod 655 config.inc.php
root@22a4bag43245: ls -la config.inc.php
-rw------- 1 root root 0 Aug 11 15:11 config.inc.php

考虑到链接的答案,我想我可以将卷移出我的 Userhome,但随后 vbox 根本不会挂载该文件夹。

如何永久更改/var/www/public/config.inc.php的文件权限?

最佳答案

我遇到了同样的问题,即使使用 chown 后也无法更改所有权.正如我 researched ,这是因为 NTFS 卷被安装在 ext 文件系统中。所以我用了另一种方法。

docker 内部的卷没有这些问题。因此,您可以将文件挂载到内部 docker 卷上,然后在本地文件夹中的任意位置创建指向该文件的硬符号链接(symbolic link):

sudo ln $(docker volume inspect --format '{{ .Mountpoint }}' <project_name>_<volume_name>) <absolute_path_of_destination>

通过这种方式,您可以将文件放在所需的位置,在 docker 内并且没有任何权限问题,并且由于硬符号链接(symbolic link),您将能够像在正常卷安装中一样修改文件的内容。

Here是这个过程的一个工作实现,它挂载和链接一个目录。如果您想了解详细信息,请参阅 possible fix issue中的部分.

编辑

实现此方法的步骤:

  1. 将相关文件挂载到内部 docker-volume(也称为 named volumes)中。
  2. 在进行硬链接(hard link)之前,请确保卷和相关文件存在于那里。为确保这一点,您应该在之前至少运行一次容器,或者如果您想自动创建此文件,您可以包含一个 docker run 来创建所需的文件并退出。

    docker run --rm -itd \
    -v "<Project_name>_<volume_name>:/absolute/path" \
    <image> bash -c "touch /absolute/path/<my_file>"

此 docker run 将创建卷和所需文件。在这里,container是我的项目名称,默认是项目所在文件夹的名称,<volume_name>与我们要在原始容器中使用的相同。 <image>可以是已在您的原始容器中使用的同一容器。

  1. 在您的操作系统中创建指向系统上实际文件位置的硬链接(hard link)。您可以使用 docker volume inspect --format '{{ .Mountpoint }}' <project_name>_<volume_name>/<my_file> 找到文件位置. Linux用户可以使用ln在终端和 windows 用户可以使用 mklink在命令提示符下。

在第 3 步中我们没有使用 /absolute/path自从<volume_name>已经引用了那个位置,我们只需要引用文件。

关于docker - 在 Windows 主机上的 docker 容器内更改挂载文件夹中的文件权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45635937/

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