在Docker容器中更改已装入文件夹中的文件权限

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

我发现: 无法在Docker容器(Docker for Windows)中调用chown,并认为这可能有点相关,但似乎只适用于MongoDB。

这是我的docker-compose.yml

  version: "3" services: pma: image: (secrect company registry)/docker-stretchimal-apache2-php7-pma 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和更改在挂载的目录中,我尝试运行chmodconfig.inc.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的文件权限?

编辑:

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

我select在Hyper-V上使用docker-machine Virtualbox工作stream程,因为我需要在日常工作stream程中使用VBox,并且在一个系统上运行Hyper-V和Virtualbox是不可能的,因为不同的虚拟机pipe理程序之间不兼容。

即使在使用chown之后,我也遇到了不能更改所有权的问题。 正如我研究 ,这是因为NTFS卷安装在ext文件系统。 所以我用另一种方法。

docker内部的卷没有这些问题。 因此,您可以将文件挂载到内部docker卷上,然后创build一个硬链接到本地​​文件夹内的任何文件的任何位置:

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

这样,您可以将文件放置在Docker内的所需位置,并且没有任何权限问题,并且由于硬符号链接,您将能够像正常卷装入一样修改文件的内容。

这是挂载和链接目录的这个过程的一个工作实现。 如果您想知道详细信息,请参阅possible fix部分。

编辑

实施这种方法的步骤:

  1. 将相关文件挂载到内部泊坞窗(也称为named volumes )中。
  2. 在制作硬链接之前,请确保存在卷和有关文件。 为了确保这一点,你应该至less运行一次你的容器,或者如果你想自动创build这个文件,你可以包含一个docker run,它会创build所需的文件并退出。

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

这个docker运行将创build卷和所需的文件。 在这里, container是我的项目名称,默认情况下,它是项目所在文件夹的名称, <volume_name>与我们原始容器中要使用的名称相同。 <image>可以是已经在原始容器中使用的那个。

  1. 在您的操作系统中创build一个硬链接到系统上的实际文件位置。 您可以使用docker volume inspect --format '{{ .Mountpoint }}' <project_name>_<volume_name>/<my_file>来查找文件位置。 Linux用户可以在terminal中使用ln ,windows用户可以在命令提示符下使用mklink

在步骤3中,我们没有使用/absolute/path因为<volume_name>已经指向那个位置,我们只需要引用这个文件。

尝试以下方法之一:

  1. 如果你可以重build图像image: image: (secrect company registry)/docker-stretchimal-apache2-php7-pma然后在image: (secrect company registry)/docker-stretchimal-apache2-php7-pma文件里添加以下内容

    USER root RUN chmod 655 config.inc.php

然后,你可以重build图像,并将其推送到registry,你在做什么应该工作。 这应该是您的首选解决scheme,因为您不希望在每次启动新容器时手动更改权限

  1. 尝试明确地使用用户root进行exec

    docker exec -it -u root [container] bash