Докер: монтируется. Пути... не разделяются с OS X и не известны Docker

Запуск команды docker -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 и, следовательно, должен быть известен Docker. Любая помощь в решении этого вопроса будет оценена по достоинству.

В качестве эксперимента я заменил /private в разделе "Общий доступ к файлам" на /private/var/folders и перезапустил докер, но результат не изменился.

Для более полной ссылки это скрипт.sh, который запускает этот скрипт python, который, в свою очередь, выполняет команду docker.

Ответ 1

Докеры для Mac громкоговорителей ведут себя иначе, чем базовая система Docker. Это происходит главным образом из-за того, что Docker пытается соответствовать правилам песочницы файловой системы Apple.

Как показано в настройках Docker, только macOS экспортирует только определенные пути.

  • /Users
  • /Volumes
  • /tmp
  • /private

File Sharing preference panel

/var в macOS - это символическая ссылка в /private. Это также верно для /tmp:

$ ls -ld /tmp /var
[email protected] 1 root  wheel  11 Jan 26 16:18 /tmp -> private/tmp
[email protected] 1 root  wheel  11 Jan 26 16:18 /var -> private/var

Почему /tmp указан на панели общего доступа, но /var не является (хотя оба являются частью /private)? Документация Docker для Mac о пространствах имен файловой системы объясняет:

По умолчанию вы можете совместно использовать файлы в /Users/, /Volumes/, /private/ и /tmp. Чтобы добавить или удалить деревья каталогов, экспортированные в Docker, используйте вкладку "Общий доступ к файлам" в меню "Настройки докеров" → "Настройки" → "Обмен файлами". (См. "Настройки".)

Все другие пути, используемые в -v монтированиях, поступают из Moby Linux VM, работающей с контейнерами Docker, поэтому такие аргументы, как -v/var/run/docker.sock: /var/run/docker.sock должны работать -v/var/run/docker.sock: /var/run/docker.sock образом, Если путь macOS не используется совместно и не существует в виртуальной машине, попытка связать его с монтированием приведет к сбою, а не созданию его в виртуальной машине. Пути, которые уже существуют в VM и содержат файлы, зарезервированы Docker и не могут быть экспортированы из macOS.

Обратите внимание, что /var/run конкретно упоминается здесь как место, которое будет монтироваться из виртуальной машины Linux, а не из macOS.

Когда вы запрашиваете установку тома, сначала экспортируется экспорт файловой системы macOS. Если там нет совпадения, тогда будет проверена виртуальная машина Linux, в которой работает Docker. Если ни один из них не имеет запрошенного вами пути, то соединение не удастся.

В вашем случае /var не экспортируется macOS. /var существует в виртуальной машине Linux, но /var/folders нет. Следовательно, путь недоступен, и установка не работает.

Если вы измените путь к /private/var, это будет успешным, потому что macOS экспортирует дерево всей файловой системы /private для установки.

Чтобы сделать вещи более переносимыми, вам может потребоваться проверить, на какой платформе вы в настоящее время работаете, и если она macOS, префикс пути монтирования с /private.

Ответ 2

В качестве примера, используя 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, это не сработает. Я думаю (но не уверен), что его, потому что Docker пытается сделать mkdir. Поэтому, если я пытаюсь установить -v/var/whatever: /data, mkdir терпит неудачу, потому что недостаточно разрешения, и он не работает.

У меня 2 Mac (High Sierra), и я попробовал это на обоих. Та же проблема. Кроме того, я пробовал использовать Docker Beta. Думаю, я понимаю, что Дэни Лоу отвечает: я обновлю этот ответ, если это сработает для меня.