Докер: крепления отказано. Пути ... не являются общими для OS X и не известны Docker
команда docker run-v /var/folders/zz/... выдает следующую ошибку.
docker: Error response from daemon: Mounts denied:
The paths /var/folders/zz/... and /var/folders/zz/...
are not shared from OS X and are not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
когда я открываю общий доступ к файлам, я вижу, что /private уже указан.
если я попытаюсь добавить /var / folder/, он разрешится в/private/var /folders, который является подмножеством / private и, следовательно, добавление отклоняется.
подводя итог, мне кажется, что это каталог / var / folders/.. является общим для OS X как подкаталог /private и, следовательно, должен быть известен Докер. Любая помощь в решении этой проблемы была бы признательна.
в качестве эксперимента Я заменил /private в файлообменнике на/private/var / folders и перезапустил докер, но результат не изменился.
просто для более полной справки, это .SH script, который работает этот скрипт python, который в свою очередь запускает команду docker.
2 ответов
настройки для Mac крепления томов ведут себя иначе, чем базовая система Docker. Это в основном потому, что Docker пытается соответствовать рекомендациям Apple по песочнице файловой системы.
как показано в настройках Docker, только определенные пути экспортируются macOS.
/Users
/Volumes
/tmp
/private
/var
in macOS является символической ссылкой на /private
. Это также верно для /tmp
:
$ ls -ld /tmp /var
lrwxr-xr-x@ 1 root wheel 11 Jan 26 16:18 /tmp -> private/tmp
lrwxr-xr-x@ 1 root wheel 11 Jan 26 16:18 /var -> private/var
почему /tmp
перечислены в панели общего доступа, но /var
нет (хотя оба являются частью /private
)? Docker для документация о пространствах имен файловой системы объясняю:
по умолчанию, вы можете обмениваться файлами в
/Users/
,/Volumes/
,/private/
и/tmp
напрямую. Чтобы добавить или удалить деревья каталогов, экспортируемые в Docker, используйте файл вкладка "общий доступ" в настройках Docker whale меню -> Настройки -> общий доступ к файлам. (См. Раздел Предпочтения.)все другие пути, используемые в
-v
крепления привязки получены из виртуальной машины Moby Linux, работающей с контейнерами Docker, поэтому такие аргументы, как-v /var/run/docker.sock:/var/run/docker.sock
должны работать, как ожидалось. Если путь macOS не является общим и не существует в виртуальной машине, попытка привязать монтирование завершится неудачей, а не созданием его в виртуальной машине. пути, которые уже существуют в виртуальной машине и содержать файлы зарезервированы Docker и не могут быть экспортированы из macOS.
отметим, что /var/run
конкретно упоминается здесь как место, которое будет монтироваться с виртуальной машины Linux, а не с macOS.
при запросе монтирования Тома сначала проверяется экспорт файловой системы macOS. Если там нет совпадения, проверяется виртуальная машина Linux, в которой работает Docker. Если ни один из них не имеет пути, который вы запросили, то монтирование завершается неудачей.
In ваше дело,/var
не экспортируется macOS. /var
существует в виртуальной машине Linux, но /var/folders
нет. Поэтому путь недоступен, и монтирование завершается неудачно.
если вы измените путь к /private/var
, то это будет успешным, потому что macOS экспортирует весь /private
дерево файловой системы для монтажа.
чтобы сделать вещи более портативными, вы можете проверить, на какой платформе вы в настоящее время работаете, и если это macOS, префикс пути монтирования с /private
.
в качестве примера, используя Portainer, эта команда работает для меня:
docker run -d --restart unless-stopped -p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var:/data portainer/portainer --no-auth
но, если я меняю -v /var:/data
вообще, это не сработает. Я думаю (но не уверен), что это потому, что докер пытается сделать mkdir. Итак, если я попытаюсь смонтировать -v /var/whatever:/data
, mkdir терпит неудачу, потому что недостаточно разрешения, и он не работает.
у меня есть 2 Mac (High Sierra), и я попробовал его на обоих. Та же проблема. Кроме того, я попытался использовать бета-канал Docker. Я думаю, что понимаю ответ Дэна Лоу: я обновлю этот ответ, если это работает для меня.