jjzjj

php - XSym 符号链接(symbolic link)不能在 Docker for Windows 上的 PHP 中使用

coder 2024-04-07 原文

在 Windows 上的 Docker 容器内使用 PHP 时(例如使用 DDEV),在容器内创建的符号链接(symbolic link)(例如由 composer 创建)似乎无法正确处理 PHP 的文件流。

场景

想象一下下面的 PHP 代码

<?php
mkdir('demo-base-directory');
symlink('demo-base-directory', 'demo-symbolic-link');
var_dump(glob('demo-*', GLOB_ONLYDIR));

如果在容器内执行,它只输出 demo-base-directory,但是缺少 demo-symbolic-link(同样的例子在 Linux 上按预期运行/Docker 容器内的 Unix 系统)

array(1) {
  [0]=>
  string(19) "demo-base-directory"
}

在主机系统中查看符号链接(symbolic link)时(例如,在 Windows PowerShell 中使用 cat demo-symbolic-link)它显示

XSym
0019
0df68e8650ddca993c28277a5cfa3dcd
demo-base-directory

还有其他关于 Docker for Windows 的关于符号链接(symbolic link)仿真的报告——我无法使用 fgetsfile_get_contents 重现此行为,但对于提到的 glob 调用,参见

共享卷作为 Samba/CIFS 安装在 Windows 主机系统上基于 Linux 的 Docker 容器中,如下所示:

//10.0.75.1/C on /var/www/html type cifs (rw,relatime,vers=3.02,sec=ntlmsspi,cache=strict,username=olly,domain=OLIVERHADERB9D8,uid=0,noforceuid,gid=0,noforcegid,addr=10.0.75.1,file_mode=0755,dir_mode=0777,iocharset=utf8,nounix,serverino,mapposix,nobrl,mfsymlinks,noperm,rsize=1048576,wsize=1048576,echo_interval=60,actimeo=1)

挂载选项 mfsymlinks 指的是 Minshall+French symlinks

解决方法

与其在容器内创建符号链接(symbolic link),不如在外部(直接在 Windows 中)创建它们可以解决问题。

使用普通 mklink in cmd.exe

del demo-symbolic-link
mklink /d demo-symbolic-link demo-base-directory

输出

symbolic link created for demo-symbolic-link <<===>> demo-base-directory

在 PowerShell 中通过 cmd 使用普通的 mklink

del demo-symbolic-link
cmd /c mklink /d demo-symbolic-link demo-base-directory

输出

symbolic link created for demo-symbolic-link <<===>> demo-base-directory

旁注:New-Item -ItemType SymbolicLink 无法使用 glob(..., PHP 中的 GLOB_ONLYDIR 解析 - 使用 mklink/d 也在这里

在 Windows 中使用 Git-Bash

我必须在以管理员身份执行 Git-Bash 时执行以下命令。使用 export 设置环境变量在这里很重要 - 参见 Enable native NTFS symbolic links for Cygwin

rm demo-symbolic-link
export MSYS=winsymlinks:nativestrict
ln -s demo-base-directory/ demo-symbolic-link

辅助工具

我创建了帮助工具示例,用于在特定目录(TYPO3 相关,public/typo3conf/ext/)中搜索 Samba XSym 指针并“升级” XSym 指向正确符号链接(symbolic link)的指针 - 执行这些脚本时可能需要管理员权限:

结果

再次执行上面的 PHP 示例现在会输出两个预期的项目

array(2) {
  [0]=>
  string(19) "demo-base-directory"
  [1]=>
  string(18) "demo-symbolic-link"
}

问题

在 Docker 容器内工作并且必须在主机系统上手动调整符号链接(symbolic link)实际上只是一种变通方法 - 而不是解决方案。为了仅使用 Docker 容器创建正确的符号链接(symbolic link),可以在哪个级别对其进行增强和优化?

这似乎可以在不同的层次上解决:


更新

  • mklink/j(连接点)切换到 mklink/d(符号链接(symbolic link)目录),因为删除链接的连接点也删除了它的来源
  • PowerShell 的符号链接(symbolic link) cmdlet New-Item -ItemType SymbolicLink(而不是之前的 New-Item -ItemType Junction)再次无法使用 glob(. .., PHP 中的 GLOB_ONLYDIR - 结果,在此处使用 cmd/c mklink/d
  • 添加了 Samba/CIFS 安装信息

最佳答案

从 ddev v1.5.0 开始,Windows 上的 ddev composer 命令会尝试将 XSym 符号链接(symbolic link)转换为合法的 Windows 符号链接(symbolic link)。此功能仅在您在 Windows 上启用“开发人员模式”时才有效。参见 Windows OS and ddev composer在文档中。

关于php - XSym 符号链接(symbolic link)不能在 Docker for Windows 上的 PHP 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53396559/

有关php - XSym 符号链接(symbolic link)不能在 Docker for Windows 上的 PHP 中使用的更多相关文章

  1. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  2. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  3. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  4. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  5. ruby-on-rails - Ruby - 如何从 ruby​​ 上的 .pfx 文件中提取公钥、rsa 私钥和 CA key - 2

    我有一个.pfx格式的证书,我需要使用ruby​​提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o

  6. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  7. ruby - 如果它是标点符号,我怎么能从字符串中删除最后一个字符,在 ruby​​ 中? - 2

    啊,正则表达式有点困惑。我正在尝试删除字符串末尾所有可能的标点符号:ifstr[str.length-1]=='?'||str[str.length-1]=='.'||str[str.length-1]=='!'orstr[str.length-1]==','||str[str.length-1]==';'str.chomp!end我相信有更好的方法来做到这一点。有什么指点吗? 最佳答案 str.sub!(/[?.!,;]?$/,'')[?.!,;]-字符类。匹配这5个字符中的任何一个(注意,。在字符类中并不特殊)?-前一个字符或组

  8. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  9. ruby - 如何在 Ruby 字符串中插入项目符号字符? - 2

    我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195

  10. 带有 attr_accessor 的类上的 Ruby instance_eval - 2

    我了解instance_eval和class_eval之间的基本区别。我在玩弄时发现的是一些涉及attr_accessor的奇怪东西。这是一个例子:A=Class.newA.class_eval{attr_accessor:x}a=A.newa.x="x"a.x=>"x"#...expectedA.instance_eval{attr_accessor:y}A.y="y"=>NoMethodError:undefinedmethod`y='forA:Classa.y="y"=>"y"#WHATTT?这是怎么回事:instance_eval没有访问我们的A类(对象)然后它实际上将它添加到

随机推荐