在Windows主机上的docker容器内的已安装文件夹中更改文件权限

Tom*_*m M 6 docker docker-compose docker-machine docker-toolbox docker-for-windows

免责声明/编辑2

几年后,对于每个人都在阅读这个问题 - 如果你在Windows上并希望将docker与linux容器一起使用,我强烈建议不要使用docker for windows,而是在VM中完全启动整个docker环境.这个Ext3 NTFS问题将在许多不同的层面打破你的脖子,安装docker-machine可能甚至不值得努力.


编辑:

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

我选择docker-machine在Hyper-V 上使用Virtualbox工作流程,因为我在日常工作流程中需要VBox,并且由于不同的Hypervisor之间不兼容而无法在一个系统上运行Hyper-V和Virtualbox.

原始问题

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

我发现:无法在Docker容器(Docker for Windows)中调用chown,并认为这可能有些相关,但它似乎只适用于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
Run Code Online (Sandbox Code Playgroud)

现在,当我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
Run Code Online (Sandbox Code Playgroud)

考虑到链接的答案,我想我可以将音量从我的Userhome中移出,但是vbox根本没有安装该文件夹.

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

Ayu*_*hya 9

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

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

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

通过这种方式,您可以将文件放在所需的位置,在docker中,并且没有任何权限问题,并且您将能够像在正常的卷装配中那样修改文件的内容,因为硬符号链接.

以下是此过程的一个有效实现,它安装并链接目录.如果您想了解详细信息,请参阅possible fix节中的问题.

编辑

实施此方法的步骤:

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

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

在步骤3中我们没有使用,/absolute/path因为<volume_name>已经引用了该位置,我们只需要引用该文件.


yam*_*enk 6

尝试以下方法之一:

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

    USER root RUN chmod 655 config.inc.php

然后您可以重建映像并将其推送到注册表,您所做的应该可以工作。这应该是您的首选解决方案,因为您不希望每次启动新容器时都手动更改权限

  1. 尝试使用 root 用户显式执行

    docker exec -it -u root [container] bash