При использовании PHP внутри контейнера Docker в Windows (например, с использованием DDEV) символические ссылки, созданные внутри контейнера (например, с помощью 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 / Unix внутри контейнеров Docker)
array(1) {
[0]=>
string(19) "demo-base-directory"}
При просмотре символической ссылки в хост-системе (например, с использованием cat demo-symbolic-link
в Windows PowerShell) это показывает
XSym
0019
0df68e8650ddca993c28277a5cfa3dcd
demo-base-directory
В Docker для Windows были и другие отчеты об эмуляции символических ссылок — я не смог воспроизвести это поведение для файлов, использующих fgets
или же file_get_contents
но для упомянутых glob
вызов, см.
Общие тома монтируются в контейнере Docker на базе Linux в хост-системе Windows в виде монтирования Samba / CIFS следующим образом:
//10.0.75.1/C on / var / www / html type cifs
(RW, relatime, уегз = 3,02, сек = ntlmsspi, кэш = строги, имя пользователя = Olly, домен = OLIVERHADERB9D8, UID = 0, noforceuid, GID = 0, noforcegid, адр = 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 + французские символические ссылки
Вместо создания символических ссылок внутри контейнера, создавая их вне (непосредственно в 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
здесь важно — смотрите Включить собственные символические ссылки NTFS для Cygwin
rm demo-symbolic-link
export MSYS=winsymlinks:nativestrict
ln -s demo-base-directory/ demo-symbolic-link
Я создал примеры вспомогательных инструментов, которые ищут Samba XSym
указатели в определенном каталоге (связанные с TYPO3, public/typo3conf/ext/
) и «обновить» указатели XSym до соответствующих символических ссылок — вероятно, при выполнении этих сценариев требуются права администратора:
Выполнение примера PHP сверху снова выводит оба ожидаемых элемента
array(2) {
[0]=>
string(19) "demo-base-directory"[1]=>
string(18) "demo-symbolic-link"}
Работа внутри контейнера Docker и необходимость вручную настраивать символические ссылки в хост-системе — это всего лишь обходной путь, а не решение. На каком уровне это можно улучшить и оптимизировать, чтобы создавать правильные символические ссылки только с использованием контейнера Docker?
Кажется, это можно решить на разных уровнях:
glob
вызов (особенно для слоеного GLOB_ONLYDIR
флаг)glob
реализация (особенно для Minshall + французские символические ссылки XSym
)Обновления
mklink /j
(соединение) с mklink /d
(каталог с символическими ссылками), так как удаление связанного соединения также привело к удалению его источникаNew-Item -ItemType SymbolicLink
(вместо предыдущего New-Item -ItemType Junction
) затем снова не может быть решена с помощью glob(..., GLOB_ONLYDIR
в PHP — в результате, используя cmd /c mklink /d
ВотНачиная с ddev v1.5.0, ddev composer
Команда Windows пытается преобразовать символические ссылки XSym в допустимые символические ссылки Windows. Эта функция работает, только если вы включили «Режим разработчика» в Windows. Увидеть ОС Windows и ddev composer в документах
Других решений пока нет …