Символические ссылки XSym нельзя использовать в PHP на Docker для Windows

При использовании 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) решает проблему.

Используя равнину 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

Использование простого mklink через cmd в PowerShell

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 для Windows

При выполнении 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?

Кажется, это можно решить на разных уровнях:


Обновления

  • переключился с mklink /j (соединение) с mklink /d (каталог с символическими ссылками), так как удаление связанного соединения также привело к удалению его источника
  • Командлет символической ссылки PowerShell New-Item -ItemType SymbolicLink (вместо предыдущего New-Item -ItemType Junction) затем снова не может быть решена с помощью glob(..., GLOB_ONLYDIR в PHP — в результате, используя cmd /c mklink /d Вот
  • добавлена ​​информация о монтировании Samba / CIFS

4

Решение

Начиная с ddev v1.5.0, ddev composer Команда Windows пытается преобразовать символические ссылки XSym в допустимые символические ссылки Windows. Эта функция работает, только если вы включили «Режим разработчика» в Windows. Увидеть ОС Windows и ddev composer в документах

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]