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

Команда docker run -v /var/folder /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 / folder, который является подмножеством / private, и поэтому добавление отклоняется.

Подводя итог, мне кажется, что каталог / var / folder /.. является общим для OS X как подкаталог / private и, следовательно, должен быть известен Docker. Любая помощь в решении этого будет принята с благодарностью.

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

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

19 ответов

Решение

Крепления томов 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 bind mounts получены из виртуальной машины 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,

Предварительные требования: необходимо установить «рабочий стол докера». Выполните шаги, указанные на изображении:

В новой версии Docker для Mac 3.0.0 вам необходимо отключить использование gRPC FUSE для обмена файлами в меню «Настройки»> «Экспериментальные функции».

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

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

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

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

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

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

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

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

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

удалите версию 20 и загрузите старую стабильную версию https://desktop.docker.com/mac/stable/48506/Docker.dmg

В текущей последней версии (Docker 3.0.2) в macos вы должны разрешить каталог для чтения докеров:

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

если вы не видите папку на Mac, отобразите ее, открыв терминал и введите:

по умолчанию пишет com.apple.Finder AppleShowAllFiles YES

затем перезапустите искатель, удерживая клавишу ALT и щелкнув правой кнопкой мыши (два пальца) по искателю, и выберите перезапустить, затем нажмите «искатель» рядом с файлом в строке меню, нажмите «Настройки», добавьте галочку на жестких дисках в разделе «Показать эти элементы на рабочем столе», затем боковая панель также проверьте жесткие диски, затем перейдите в скрытую папку и перетащите ее в избранное, и она появится в докере> настройки> ресурсы> общий доступ к файлам> + окно

Если у вас все еще есть эта проблема на MAC, попробуйте добавить: $PWD

Добавьте $PWD перед путем к локальному каталогу файлов, например так: docker run -v $PWD / folder /: / path / to / directory.

Вы можете прочитать этот документ с более подробной информацией: https://docs.docker.com/desktop/settings/mac/#file-sharing тома: один относится к текущему компьютеру, другой относится к контейнерам докера, а в Файл настроек Docker /Users уже установлен в настройках Docker для общего доступа к файлам, а на Mac /Users может найти почти все файлы на вашем компьютере.

Я хотел бы добавить, что у меня уже был добавлен путь в Docker, но я решил, что монтирование привязки должно быть абсолютным, а не относительным, и я указывал на несуществующий файл. Я получал ту же ошибку, что и OP.

Если у вас есть файл .env , дважды проверьте константу BASE_PATH, так как она может содержать неверный путь.

      # System Configuration
BASE_PATH=/Users/<your_OS_user>/Projects

В моем случае речь шла об этом.

вам нужно добавить оба / private / var / tmp и / var / tmp, чтобы решить проблему

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

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

я добавляю папку/buildsкfilesharingDirectoriesв~/Library/Group\ Containers/group.com.docker/settings.json, нравиться:

      "filesharingDirectories": [
    "/builds",
    "/host_mnt",
    "/tmp",
    "/Users",
    "/Volumes",
    "/private",
    "/var/folders"
  ],

(я также добавилhost_mnt)

Затем я добавил обе папки в/используя файл:

      mkdir -p /Users/me/gitlab-misc/builds
mkdir -p /Users/me/gitlab-misc/host_mnt
sudo vim /etc/synthetic.conf

Внутри/etc/synthetic.confУ меня есть:

      builds  /Users/me/gitlab-misc/builds
host_mnt    /Users/me/gitlab-misc/host_mnt

(Используйте TAB, а не пробел)

      sudo chmod 0644 /etc/synthetic.conf
sudo chown root:wheel /etc/synthetic.conf

И перезагрузить машину

С моей стороны: после добавления папки перезапуск терминала и докера решил проблему на моей стороне.

Для netcoreapp убедитесь, что вы поделились /usr/local/share/

Другие вопросы по тегам