Символические ссылки XSym нельзя использовать в PHP на Docker для Windows - PullRequest
0 голосов
/ 20 ноября 2018

При использовании PHP внутри контейнера Docker в Windows (например, с использованием 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 отсутствует (тот же пример работает, как и ожидалось, в 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 ocifs типа n / var / www / html (rw, relaytime, vers = 3.02, sec = ntlmsspi, cache = строгий, username = olly, домен = OLIVERHADERB9D8, uid = 0, noforceuid, gid = 0, noforcegid, addr = 10.0.75,1, file_mode = 0755, dir_mode = 0777, iocharset = utf8, существительное, serverino, mapposix, nobrl, mfsymlinks, noperm, rsize = 1048576, wsize = 1048576, echo_interval = 60, actimeo = 1)

1034* Параметр монтирования
mfsymlinks относится к Minshall + французские символические ссылки

Обходной путь

Вместо создания символических ссылок внутри контейнера, их создание снаружи (решает проблему.

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

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

output

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 (junction) в mklink /d (каталог с символическими ссылками), поскольку при удалении связанного перехода также был удален его источник
  • Командлет symlink PowerShell New-Item -ItemType SymbolicLink (вместо предыдущего New-Item -ItemType Junction), затем снова не может быть разрешен с помощью glob(..., GLOB_ONLYDIRв PHP - в результате, используя cmd /c mklink /d здесь
  • добавлена ​​информация о монтировании Samba / CIFS

1 Ответ

0 голосов
/ 08 января 2019

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

...