Докер: крепления отказано. Пути ... не являются общими для 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

File Sharing preference panel

/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. Я думаю, что понимаю ответ Дэна Лоу: я обновлю этот ответ, если это работает для меня.