在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
和更改在挂载的目录中,我尝试运行chmod
在config.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
部分。
编辑
实施这种方法的步骤:
- 将相关文件挂载到内部泊坞窗(也称为
named volumes
)中。 -
在制作硬链接之前,请确保存在卷和有关文件。 为了确保这一点,你应该至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>
可以是已经在原始容器中使用的那个。
- 在您的操作系统中创build一个硬链接到系统上的实际文件位置。 您可以使用
docker volume inspect --format '{{ .Mountpoint }}' <project_name>_<volume_name>/<my_file>
来查找文件位置。 Linux用户可以在terminal中使用ln
,windows用户可以在命令提示符下使用mklink
。
在步骤3中,我们没有使用/absolute/path
因为<volume_name>
已经指向那个位置,我们只需要引用这个文件。
尝试以下方法之一:
-
如果你可以重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,因为您不希望在每次启动新容器时手动更改权限
-
尝试明确地使用用户root进行exec
docker exec -it -u root [container] bash