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

110

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

В качестве эксперимента я заменил /privateв File Sharing на /private/var/foldersи перезапустил докер, но результат не изменился.

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

Ааюш
источник
3
Вы пробовали -v /private/var/folders/zz/...?
Дэн Лоу
@DanLowe: Я не имел, потому что код пошел , как WORKING_DIR="$(mktemp -d)и -v ${WORKING_DIR}. Но взлом WORKING_DIR="/private"$(mktemp -d), похоже, решает проблему. Большое спасибо :)
Aayush
Я отправлю ответ, объясняющий, почему это сработало, когда у меня будет несколько минут
Дэн Лоу
Было бы здорово, еще раз спасибо.
Aayush
Я получаю такое же сообщение об ошибке. Моя ситуация в том, что в вашем каталоге нет места, я меняю "серверную сторону" на "serverSide", после чего она решается. надеюсь, что это может помочь кому-то.
andrew54068

Ответы:

132

Монтирование томов Docker для Mac отличается от базовой системы Docker. В основном это связано с тем, что Docker пытается соответствовать рекомендациям Apple по песочнице файловой системы.

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

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

Панель настроек общего доступа к файлам

/varв 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 для Mac о пространствах имен файловой системы объясняется:

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

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

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

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

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

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

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

Дэн Лоу
источник
4
@ SamuelMéndez Только первый. Формат существует mac-path:container-pathи /privateбудет существовать только на стороне Mac.
Дэн Лоу
2
Я столкнулся с подобной проблемой, может ли кто-нибудь помочь мне решить ("b'Mounts denied: \ r \ nПуть / etc / localtime \ r \ n не используется совместно с OS X и не известен Docker. \ R \ nВы можете настроить общие пути из Docker -> Настройки ... -> Общий доступ к файлам. \ r \ nСм. docs.docker.com/docker-for-mac/osxfs/#namespaces для получения дополнительной информации. \ r \ n. '") попытался добавить / etc через Docker -> Настройки ... -> Общий доступ к файлам, в нем говорится, что / etc зарезервирован для Mac OS, какие-либо решения, ребята?
Sandish Kumar HN
1
@DanLowe Спасибо за ответ. Если я пытаюсь добавить / private / etc / localtime, выдает сообщение «Путь экспорта / private / etc / localtime перекрывается с путем экспорта / private». Я устал добавлять "/ etc / localtime", но получил новую ошибку: "APIError: 500 Server Error: Internal Server Error (" ошибка при создании пути к источнику монтирования '/ etc / localtime': mkdir / etc / localtime: файл существует ") " Любая идея??
Sandish Kumar HN
2
Давайте продолжим эту дискуссию в чате .
Сандиш Кумар Х.Н.
1
@DanLowe Спасибо за любезный ответ. Я понимаю вас. Когда мы разрабатываем на Mac OS, развертываем на Ubuntu. Мы используем docker-compose для тома / etc / localtime. Мы собираемся проверить систему и установить другой путь? Как /private/etc/localtimeдля mac os, /etc/localtimeдля ubuntu. Как сообщить системную информацию в Docker-compose.yml? Спасибо!
hzwzw 01
4

В качестве альтернативного решения:

Измените путь с /private/instance1-data:/homeна./instance1-data:/home

В области * nix и, следовательно, в Docker, .указывает текущий каталог. Поскольку macOS разборчива и становится еще разборчивее в отношении песочницы, это кажется жизнеспособным решением для macOS. Просто создайте нужную папку instance1в том же каталоге.

Еще одно преимущество этого решения в том, что оно устраняет необходимость работать docker-composeс sudo. Тем не менее, в данном случае это не причиняет вреда, но все же это плюс.

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

Джангофан
источник
2

У меня была аналогичная проблема, когда я создал каталог /var/tmp на моем Mac, который я хотел смонтировать в своем контейнере докеров.

Решил это, добавив путь к каталогу к файлу следующим образом:

$ cat ~/Library/Group\ Containers/group.com.docker/settings.json  
{
  "filesharingDirectories" : [
    "\/Users",
    "\/Volumes",
    "\/private",
    "\/tmp",
    "\/var\/tmp"
  ],
…

Теперь я мог видеть каталог /var/tmp в Docker-> preference-> resources-> file sharing. Затем перезапустил докер.

Затем это решило мою проблему с установкой.

Саум
источник
0

Моя проблема исправлена, когда я удалил путь к проекту из общего доступа к файлам в настройках докера и перезапустил докер, а затем снова добавил путь к файлу проекта.

johnnashautomation
источник
0

Моя проблема исправлена ​​так же, как и у Аргьи. Мне просто нужно было удалить пути из общего доступа к файлам и перезапустить докер.

Бруно Родригес
источник