在Windows的Docker容器内使用PHP(例如,使用DDEV)时,在容器内创建的符号链接(例如,由作曲家使用)似乎不适用于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
(该示例在Docker容器内的Linux / Unix系统上可以正常工作)
array(1) {
[0]=>
string(19) "demo-base-directory"
}
在主机系统中查看符号链接时(例如,在Windows PowerShell中使用cat demo-symbolic-link
),它会显示
XSym
0019
0df68e8650ddca993c28277a5cfa3dcd
demo-base-directory
针对Windows的Docker,还有其他关于符号链接仿真的报告-对于使用fgets
或file_get_contents
的文件,我无法重现此行为,但对于提到的glob
调用,请参见>
共享卷通过Samba / CIFS挂载在Windows主机系统上的基于Linux的Docker容器中挂载,如下所示:
在/ var / www / html类型CIF上// 10.0.75.1/C (rw,relatime,vers = 3.02,sec = ntlmsspi,cache = strict,用户名= 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
在外部(直接在Windows中)创建它们可以解决此问题,而不是在容器内部创建符号链接。
del demo-symbolic-link
mklink /d demo-symbolic-link demo-base-directory
输出
symbolic link created for demo-symbolic-link <<===>> demo-base-directory
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(..., GLOB_ONLYDIR in PHP
进行解析-此处也使用mklink /d
以管理员身份执行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相关,XSym
)中搜索Samba public/typo3conf/ext/
指针,并将XSym指针“升级”到正确的符号链接-可能需要管理员权限在执行这些脚本时:
现在再次从上方执行PHP示例会输出两个预期的项目
array(2) {
[0]=>
string(19) "demo-base-directory"
[1]=>
string(18) "demo-symbolic-link"
}
在Docker容器内工作并必须在主机系统上手动调整符号链接实际上只是一种解决方法-并非解决方案。为了仅使用Docker容器创建正确的符号链接,可以在哪个级别进行增强和优化?
这似乎可以在不同的层次上解决:
glob
invocation(尤其是易碎的GLOB_ONLYDIR
标志)glob
implementation(尤其是Minshall+French symlinks XSym
)更新
mklink /j
(连接点)切换到mklink /d
(符号链接目录),因为删除链接连接点也删除了它的起源New-Item -ItemType SymbolicLink
(而不是以前的New-Item -ItemType Junction
)然后再无法在PHP中使用glob(..., GLOB_ONLYDIR
进行解析-因此,在此处使用cmd /c mklink /d
答案 0 :(得分:2)
从ddev v1.5.0开始,Windows上的ddev composer
命令尝试将XSym符号链接转换为合法的Windows符号链接。仅当您在Windows上启用了“开发人员模式”时,此功能才起作用。请参阅文档中的Windows OS and ddev composer。