3

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

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

这是我的搬运工,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,并在安装目录的变化,我尝试运行在config.inc.phpchmod但由于某些原因,它没有默默

[email protected]: ls -la config.inc.php 
-rw------- 1 root root 0 Aug 11 15:11 config.inc.php 
[email protected]: chmod 655 config.inc.php 
[email protected]: 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-machine时启动的VirtualBox的VM内boot2docker实例与/ C /用户的共享文件夹,从中可以装配卷到您的容器。上述卷的权限是问题所在。虚拟机存储在/c/Users/tom/.docker/

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

+0

是'/ c/Users/tom/projects/myproject/data/var/www/public/config.inc.php'文件还是文件夹? – Leon

+0

config.inc.php是一个文件 –

+0

,但将文件夹或文件作为卷装入时无关紧要,我无法更改权限 –

回答

4

我没有能够即使使用chown后更改所有权的同样的问题。正如我researched,这是因为NTFS卷被挂载在ext文件系统中。所以我用另一种方法。

泊坞窗内部的卷没有这些问题。所以,你可以内部泊坞窗卷上挂载文件,然后创建一个硬符号链接到该文件的本地文件夹中,无论你想:

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

这样你就可以在所需的地方你的文件,里面码头工人,没有任何权限问题,并且由于硬符号链接,您将能够像正常卷装入一样修改文件的内容。

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

编辑

步骤来实现这种方法:

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

    ​​

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

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

在步骤3中,我们没有使用/absolute/path<volume_name>指位置已经,而我们只需要参考该文件。

+0

这种方法看起来很有前景。我会尝试它,并回到你身边,谢谢 –

+0

等待,我不能硬链接我的主机操作系统,因为它的Windows。我误解了你吗? –

+0

这是针对linux操作系统的,对于windows可以使用'mklink'。更多细节[这里](https://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/) – Ayushya

1

请尝试以下之一:

  1. 如果你可以重建图像的图像:image: (secrect company registry)/docker-stretchimal-apache2-php7-pma那么泊坞窗文件中,添加以下

    USER root RUN chmod 655 config.inc.php

然后你就可以重建图像并将其推送到注册表,并且您正在做的事情应该工作。这应该是您的首选解决方案,因为你不希望手动更改权限每当你开始一个新的容器

  • 尝试使用root用户明确

    给exec

    docker exec -it -u root [container] bash

  • +0

    我无法更改从Windows主机挂载到docker容器中的目录/卷的权限。 AFAIK,1.将''chmod' confic.inc.php' **里面的图像,这将被我挂载confic.inc.php覆盖。 2.不起作用。即使我'-u root',我的'chmod'权限依然不会改变。 –

    +0

    @TomM你能提供图像的码头文件吗? – yamenk

    +0

    不,对不起。但它不适用于官方注册表中的图像,所以我怀疑图像出现故障 –