При использовании 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 + французские символические ссылки Обходной путь
Вместо создания символических ссылок внутри контейнера, их создание снаружи (решает проблему.
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