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

2024-03-08

免责声明/编辑2

几年后,对于每个读到这个问题的人 - 如果您在 Windows 上并且想要将 docker 与 Linux 容器一起使用,我强烈建议根本不要在 Windows 上使用 docker,而是完全在虚拟机内启动整个 docker 环境。这个 Ext3 NTFS 问题会在很多不同层面上折断你的脖子,以至于安装 docker-machine 甚至可能不值得。


Edit:

我在用docker-machine https://docs.docker.com/machine/overview/它在 Virtualbox VM 内启动一个 boot2docker 实例,并在 /c/Users 上有一个共享文件夹,您可以从中将卷挂载到容器中。上述卷的权限是问题所在。 VM 存储在 /c/Users/tom/.docker/ 下

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

原问题

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

我发现:无法在 Docker 容器内调用 chown (Docker for Windows) https://stackoverflow.com/questions/40834349/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 on the config.inc.php但由于某种原因,它失败了silently.

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

考虑到链接的答案,我想我可以将卷移出我的用户主目录,但 vbox 根本不会安装该文件夹。

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


我遇到了同样的问题,即使使用后也无法更改所有权chown。正如我研究过的 https://superuser.com/questions/1237368/ownership-remains-unchanged-after-sudo-chown-in-ubuntu,这是因为 NTFS 卷被安装在 ext 文件系统内。所以我使用了另一种方法。

docker 内部的卷不存在这些问题。因此,您可以将文件安装在内部 docker 卷上,然后在本地文件夹中的任意位置创建指向该文件的硬符号链接:

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

这样,您就可以将文件放在 docker 内部所需的位置,而不会出现任何权限问题,并且您将能够像正常卷安装中那样由于硬符号链接而修改文件内容。

Here https://github.com/reactome/container/blob/develop/deploy.sh#L156是这个过程的一个工作实现,它安装并链接一个目录。如果您想了解详细信息,请参阅possible fix部分在issue https://github.com/reactome/container/issues/29#issuecomment-320079668.

EDIT

实施此方法的步骤:

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

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

此 docker 运行将创建卷和所需的文件。这里,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>已经引用了该位置,我们只需要引用该文件即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 数据库连接何时以及为何昂贵?

    我正在对数据库进行一些研究 并且正在研究关系数据库的一些局限性 我发现大表的连接非常昂贵 但我不完全确定为什么 DBMS需要做什么来执行连接操作 瓶颈在哪里 非规范化如何帮助克服这种费用 其他优化技术 例如索引 有何帮助 欢迎个人经历 如果
  • Eclipse 配置错误:无效的 Google App Engine 目录

    我在创建 Pydev Google App Engine 项目时遇到问题 配置在选择 Google App Engine 目录时停止 以下是我将目录指向 C Program Files Google google appengine 后遇到
  • Android Studio 2.2 不支持的方法异常

    我将我的 android studio 更新到了 2 2 现在 当我打开并运行以前的项目时 我收到错误 UnsupportedMethodException Unsupported method AndroidProject getPlug
  • Sntp.sync() 忽略服务器

    我一直在尝试与 ntp 服务器同步时间 但是 nodemcu 似乎忽略了服务器参数 sync lua sntp sync fr pool ntp org function tm rtctime epoch2cal rtctime get p
  • SCRIPT5009:“$”在 IE9 中未定义

    我有一个书签 它将 div 加载到当前页面并在其中放置一个 iframe 除了 IE9 之外 小书签在所有浏览器中都可以正常工作 甚至可以在早期版本的 IE 中使用 我正在使用以下书签框架 http idc anavallasuiza co
  • 如何隐藏 mkmapview monotouch iPhone 的合法链接

    MKMapview 在其右下角有合法链接 我想在这个地方添加一个按钮 该按钮具有某种透明度 我可以隐藏法律链接吗 或者 如果我以隐藏此链接的方式设置按钮 苹果可能会拒绝我的应用程序 我的地图视图中也有一些类型的子视图 尝试使用这个 但我不知
  • 使用 dbcontext 的正确方法(全局还是作为参数传递?)

    当我调用需要的方法时dbcontext for update or insert但只想要一个saveChange 喜欢关注 操作 登录 TempDBEntity context new TempDBEntity var temp conte
  • 如何从 PHP 中的 Base 64 字符串获取图像大小

    我正在获取图像字符串的基数 64 我必须移动文件夹并将图像路径存储在数据库中 但我必须限制文件大小 我该如何执行此操作 我从 Base 64 字符串生成图像的代码如下 if image is attached with request Im
  • 一个拼接语法类,匹配可选模式并绑定属性

    我的拼接语法类定义如下 语法类匹配两个语句 第一个模式 其中一个语句 第三个和第二个模式 的序列 甚至可能根本不匹配这些语句 最后一个模式 正如您所看到的 有相当多的 重复 代码 因为每个模式要么返回模式中捕获的某些内容的属性 要么返回空的
  • 开始在雪花上使用 liquibase

    我正在尝试在雪花上开始使用 liquibase 我想我已经差不多完成了 liquibase properties 文件 driver net snowflake client jdbc SnowflakeDriver classpath l
  • Jersey REST Web 服务、Tomcat、Eclipse 和 404

    我读了很多帖子 但似乎无法解决我的问题 您还会看到大量与此帖子非常相似的帖子 甚至是相同的教程 即使跟随他们 我似乎也无法得到答案 本质上 我正在尝试遵循以下简单教程 http www vogella com articles REST h
  • 使用 jTD 连接到 SQL Server 2012

    尝试使用 JDBC 连接到 SQL Server 2012 Express Edition 这是我的代码 import java sql public class MSSqlTestConnection public static void
  • 以最少的字符数表示长

    我需要用尽可能短的字符串来表示非常大和非常小的数字 这些数字是无符号的 我尝试过直接 Base64 编码 但对于一些较小的数字 编码的字符串比仅将数字存储为字符串要长 在 URL 安全的情况下 在尽可能短的字符串中以最佳方式存储非常大或非常
  • 将背景图像更改为按钮

    我正在尝试更改按钮的背景图像 但它没有像我想象的那样工作 CSS 没问题 如下 ITA float right margin 5px 85px width 40px height 40px background FFFFFF url ITA
  • 文件-通过本地文件路径上传

    有没有办法通过文件路径启用文件上传 默认 HTML 文件上传控件显示禁用的文本框和按钮 当用户将文件路径粘贴到文本框中时 是否可以通过 JS 或其他方式上传文件 该网页位于公司内部网内 不 这样的事情在使用普通 HTML JavaScrip
  • 使用 Symfony2(.7) 减少 Twig 中的表单组布局

    我试图摆脱 symfony2 表单中 twig 中的重复布局 目前我的布局看起来像
  • CSRF 令牌不匹配 |拉拉维尔 5.4

    每当我向服务器发送 POST 请求时 都会出现 TokenMismatchException 错误 我已经尝试过发送
  • 使用 .htaccess 将 http 和 https 的所有非 www 重定向到 www

    我想将所有非 www 重定向到 www 如果请求是通过 http 它应该重定向到http www domain com http www domain com 如果请求是通过 https 则直接到https www domain com h
  • 包含自身映射的 C++ 结构

    简单的问题 我如何让它发挥作用 struct A double whatever std unordered map
  • 更改 Windows 主机上 docker 容器内已安装文件夹中的文件权限

    免责声明 编辑2 几年后 对于每个读到这个问题的人 如果您在 Windows 上并且想要将 docker 与 Linux 容器一起使用 我强烈建议根本不要在 Windows 上使用 docker 而是完全在虚拟机内启动整个 docker 环