免责声明/编辑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/下
我选择在Hyper-V上使用docker-machine
Virtualbox工作流,因为我在日常工作流程中需要VBox,并且由于不同的Hypervisor之间不兼容,因此无法在一个系统上同时运行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
并更改已挂载的目录时,我尝试在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
的文件权限?
我有同样的问题,即使在使用chown
后也无法改变所有权。正如我researched,这是因为NTFS卷被安装在ext文件系统中。所以我用另一种方法。
docker内部的卷没有这些问题。因此,您可以将文件挂载到内部docker卷上,然后在本地文件夹中的任何位置创建一个硬符号链接:
sudo ln $(docker volume inspect --format '{{ .Mountpoint }}' <project_name>_<volume_name>) <absolute_path_of_destination>
通过这种方式,您可以将文件放在所需的位置,在docker中,并且没有任何权限问题,并且您将能够像在正常的卷装配中那样修改文件的内容,因为硬符号链接。
Here是这个进程的工作实现,它安装和链接目录。如果您想了解详细信息,请参阅possible fix
中的issue部分。
编辑
实施此方法的步骤:
named volumes
)。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>
可以与原始容器中使用的相同。
docker volume inspect --format '{{ .Mountpoint }}' <project_name>_<volume_name>/<my_file>
找到文件位置。 Linux用户可以在终端中使用ln
,Windows用户可以在命令提示符下使用mklink
。在第3步中,我们没有使用/absolute/path
,因为<volume_name>
已经引用了那个位置,我们只需要引用该文件。
请尝试以下方法之一:
image: (secrect company registry)/docker-stretchimal-apache2-php7-pma
然后在docker文件中,添加以下内容
USER root
RUN chmod 655 config.inc.php
然后,您可以重建映像并将其推送到注册表,您正在做的事情应该工作。这应该是您首选的解决方案,因为您不希望每次启动新容器时都手动更改权限
docker exec -it -u root [container] bash